解题思路:
( 后来我才发现 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。
若是更大的数可以分解除数在使用。这题可能有更好的方法,我太蠢了。
参考代码:
#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分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复