【高精度】算法

一. 题目背景


在日常计算中,加减乘除是最常见不过的,放到计算机中,在unsigned long long类型范围内,可以通过高级程序设计语言编译,传给计算机硬件,进行计算,但操作数要是很大的话,大于unsigned long long的范围,就是高精度数与高精度数的操作了。

二. 高精加


初阶高精算法原理相当于小学学习的加减乘除,竖式加法乘法我们再熟悉不过了,例如123+789这个算式,用竖式写出来:

123
+789
81012
进位11
=912


答案为912,我们一步一步拆分看,先算了每一位的和,留下 mod 10 的结果,下一位加一  / 10的结果,这也就是高精加算法的核心了。

三. 代码实现


初始录入数据
正常写数字是从高位开始,但我们的计算从个位开始,所以输入输出都是倒序的

首先输入接收的是两个字符串,定义变量

#define MAXN 100000010
 
char a[MAXN], b[MAXN];
 
int A[MAXN], B[MAXN];
int C[MAXN];


主函数中进行输入和倒序将 a[ ] 内字符转为 每一位数交给 A[ ].

    scanf("%s", a);
    scanf("%s", b);
 
    int sa = strlen(a);
    int sb = strlen(b);
    int maxsize = Max(sa, sb);
 
    for (int i = sa - 1, j = 0; i >= 0; j++, i--) A[j] = a[i] - '0';
    for (int i = sb - 1, j = 0; i >= 0; j++, i--) B[j] = b[i] - '0';


加法函数代码:

void add(int A[],int sa, int B[],int sb,int C[]) {
 
    int sizec = Max(sa, sb);
    int t = 0;
 
    for (int i = 0; i < sizec; i++) {
        t += A[i] + B[i];
        C[i] = t % 10;
        t /= 10;
    }
 
    if (t) C[sizec] = t;
}
 
int Max(int a, int b) {
    if (a > b) return a;
    else return b;
}

注意当我们加至最后一位时,并没有把最后可能进位 t 放入答案数组,所以加上特判:

if (t) C[sizec] = t;

完整代码

#include<stdio.h>
#include<string.h>
 
void add(int A[], int sa, int B[], int sb, int C[]);
int Max(int a, int b);
 
#define MAXN 100000010
 
char a[MAXN], b[MAXN];
 
int A[MAXN], B[MAXN];
int C[MAXN];
 
int main(void) {
 
    scanf("%s", a);
    scanf("%s", b);
 
    int sa = strlen(a);
    int sb = strlen(b);
    int maxsize = Max(sa, sb);
 
    for (int i = sa - 1, j = 0; i >= 0; j++, i--) A[j] = a[i] - '0';
    for (int i = sb - 1, j = 0; i >= 0; j++, i--) B[j] = b[i] - '0';
 
    add(A, sa, B, sb, C);
 
    if (C[maxsize]) printf("%d", C[maxsize]);
    for (int i = maxsize - 1; i >= 0; i--) printf("%d", C[i]);
 
    return 0;
}
 
void add(int A[],int sa, int B[],int sb,int C[]) {
 
    int sizec = Max(sa, sb);
    int t = 0;
 
    for (int i = 0; i < sizec; i++) {
        t += A[i] + B[i];
        C[i] = t % 10;
        t /= 10;
    }
 
    if (t) C[sizec] = t;
}
 
int Max(int a, int b) {
    if (a > b) return a;
    else return b;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值