解题思路:
        ( 后来我才发现 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;
}


点赞(4)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

小北 2年前 回复TA
直呼厉害
C'est la vie 5年前 回复TA
厉害了~!