高精度运算

高精度运算

所谓高精度算法,即用数组来储存整数,模拟手算的方法进行四则运算。

  • 小学生算术
  • 阶乘的准确性
  • 高精度运算类 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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值