欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

高精度运算

程序员文章站 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; 
}