HzuWHF


私信TA

用户名:I7I08I9047

访问量:76346

签 名:

我RUN了

等  级
排  名 18
经  验 20440
参赛次数 13
文章发表 127
年  龄 3
在职情况 学生
学  校 贺州学院
专  业

  自我简介:

解题思路:
        ( 后来我才发现 long long 就可以过了QAQ ,数还不够大呀,当然更大也能过 )


        我太笨啦,用数列和公式算 Sn =  (1 + n) * n / 2,涉及到 加法 乘法 除法。下面都实现出来了,

高精度乘法 题号:1583, 高精度加法 题号:1475,在这里不讲,可以去那边看大佬,我也有写。


讲一下除法。

        比如 983214 ➗ 5,

        逆序被除数放到整形数组里面,变成 412389,这样最高位就在最右边,我们判断最高位是否大于等于除数 5,若是符合条件则取模, 把多余的部分放到下一位,这个例子中 9 / 5 >= 1 成立,那么最高位的后一位就要加上最高位不能整除的部分,也就是后面的 8 + ( 9 % 5 ) * 10,次高位存放的数字由 8 变成 48,最高为变成 9 / 5 = 1。

        次高位也如此,次高位后面存放的的数字由 3 变成 3 + ( 48 % 5 ) * 10 = 33,次高位变成 48 / 5 = 9,一步步进行下去,最后一位单独拿出来除,这也就实现正整数的高精度除法。下面除法的代码除数范围仅限于 0 ~ long long Max - 9。

若是更大的数可以分解除数在使用。QQ图片20180608230638.jpg这题可能有更好的方法,我太蠢了。


参考代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 222;

void change(char num[], int length);
char* Add(char num1[], char num2[]);
char* Multiply(char num1[], char num2[]);
char* Division(char num1[], char num2[]);

int main() {
	char num[N], one[2] = "1", tow[2] = "2";
	cin >> num;
	char* Addnum = Add(num, one);
	char* Multip = Multiply(Addnum, num);
	char* Divisi = Division(Multip, tow);
	puts(Divisi);
	delete[] Addnum, Multip, Divisi;
	return 0;
}

void change(char num[], int length) {
	for (int i = 0; i < length / 2; i++) {
		char temp = num[i];
		num[i] = num[length - i - 1];
		num[length - i - 1] = temp;
	}
}

char* Add(char num1[], char num2[]) {
	int length1 = strlen(num1), length2 = strlen(num2), big, small, index = 0;
	change(num1, length1); change(num2, length2);

	int *poi = new int[length1 + length2]();
	char *Addnum = new char[length1 + length2 + 1]();
	char *Big;

	if (length1 > length2) { big = length1; small = length2; Big = num1; }
	else { big = length2; small = length1; Big = num2; }

	for (; index < small; index++)
		poi[index] = num1[index] + num2[index] - '0' - '0';
	for (; index < big; index++)
		poi[index] = Big[index] - '0';

	for (int i = 0; i < length1 + length2; i++)
		if (poi[i] > 9) {
			poi[i + 1] += poi[i] / 10;
			poi[i] %= 10;
		}

	int pos = length1 + length2 - 1;
	while (pos >= 0 && poi[pos] == 0) pos--;

	for (int i = pos; i >= 0; i--)
		Addnum[pos - i] = poi[i] + '0';
	change(num1, length1);
	delete[] poi;
	return Addnum;
}

char* Multiply(char num1[], char num2[]) {
	int length1 = strlen(num1), length2 = strlen(num2);
	change(num1, length1); change(num2, length2);

	int *poi = new int[length1 + length2]();
	char *Multip = new char[length1 + length2 + 1]();

	for (int i1 = 0; i1 < length1; i1++)
		for (int i2 = 0; i2 < length2; i2++)
			poi[i1 + i2] += (num1[i1] - '0')*(num2[i2] - '0');

	for (int i = 0; i < length1 + length2; i++)
		if (poi[i] > 9) {
			poi[i + 1] += poi[i] / 10;
			poi[i] = poi[i] % 10;
		}

	int pos = length1 + length2 - 1;
	while (pos >= 0 && poi[pos] == 0) pos--;

	if (pos < 0) *Multip = '0';
	else
		for (int i = 0; i <= pos; i++)
			Multip[pos - i] = poi[i] + '0';

	delete[] poi;
	return Multip;
}

char* Division(char num1[], char num2[]) {
	int length = strlen(num1); long long div;
	change(num1, length); sscanf(num2, "%lld", &div);

	int *poi = new int[length];
	char *Divisi = new char[length + 1]();

	for (int i = 0; i < length; i++)
		poi[i] = num1[i] - '0';

	for (int i = length - 1; i > 0; i--) {
		if (poi[i] * 1.0 / div >= 1) {
			poi[i - 1] += poi[i] % div * 10;
			poi[i] = poi[i] / div;
		}
		else {
			poi[i - 1] += poi[i] * 10;
			poi[i] = 0;
		}
	} poi[0] /= div;

	int pos = length - 1;
	while (pos >= 0 && poi[pos] == 0) pos--;

	for (int i = 0; i <= pos; i++)
		Divisi[pos - i] = poi[i] + '0';
	delete[] poi;
	return Divisi;
}


 

0.0分

5 人评分

  评论区

直呼厉害
2022-12-24 19:39:58
厉害了~!
2019-12-10 19:55:18
  • «
  • 1
  • »