高精度运算
程序员文章站
2022-03-14 19:36:50
...
高精度运算
所谓高精度算法,即用数组来储存整数,模拟手算的方法进行四则运算。
- 小学生算术
- 阶乘的准确性
- 高精度运算类 bign
小学生算术
计算两个整数在相加时需要多少次进位。假设输入的数字都不超过9个数字。
Input example:
123 456
555 555
123 594
0 0
Output example:
0
3
1
// int 的上限是200000000,可以保存所有9位整数
// 因此可以用整数来保存输入,每次把 a 和 b 分别模10就能分别取得他们的个位数字
#include<stdio.h>
int main(){
int a, b;
while(scanf("%d%d",&a, &b) == 2){
if(!a && !b) return;
int c = 0, ans = 0;
for(int i = 9; i >= 0; i--){
c = (a%10 + b%10 + c) > 9 ? 1: 0;
ans += c;
a /= 10;
b /= 10;
}
printf("%d\n", ans);
}
return 0;
}
阶乘的精确值
输入不超过1000的正整数 n ,输出 n!= 1×2×3×…×n 的精确结果。
Input example :
30
Output example:
为了保存结果,应当先考虑1000!有多大,1000!约等于 4 * 10²⁵⁶⁷,因此可以用一个3000个元素的数组保存(为了方便起见,我们让 f[0] 保存结果的个位,f[1] 是十位,以此类推)。则每次只需要模拟手算 n!即可。
在输出时需要忽略前置0。
#include<stdio.h>
#include<string.h>
const int maxn = 3000;
int f[maxn];
int main(){
int i, j, n;
scanf("%d", &n);
memset(f, 0, sizeof(f));
f[0] = 1;
for(i = 2; i <= n; i++){
// 乘以 n
int c = 0;
for(j = 0; j < maxn; j++){
int s = f[j] * i + c;
f[j] = s % 10;
c = s / 10;
}
}
for(j =maxn - 1; j >= 0; j--) if(f[j]) break;
for(i = j; i >= 0; i--) printf("%d", f[i]);
printf("\n");
return 0;
}
下一篇: jQuery MD5加密实现代码