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

高精度加法运算

程序员文章站 2022-07-10 11:56:41
eg:计算12345+100003的和 ①两数逆序 54321 300001 ②不足在高位补零 543210 300001 (从左到右,从低位至高位) ③两数相加 843211 ④再逆序回正常 112348 ......

在C语言中,int类型最多只能表达的数据为【-2^31,2^31-1】,double类型虽然可以表达到300多位十进制数,但其精度损失很大,不能用于高精度计算,即使是long或者 __int64类型也只能表达【-2^63,2^63-1】的数据,所以高精度的大数加法计算需要通过数组模拟加法的过程。

①:比较两个数的长度(位数),将较大的位数存入len中。

②:a数组和b数组逆序。

③:位数若不足len的,在其高位补0。

④:最后还有可能有进位(r!=0)。

⑤:在数组最后以 ‘\0’ 结尾。

⑥:逆序回正常。

#include "stdio.h"
#include "string.h"
#include "algorithm"
#define N 3005
using namespace std;
void add(char a[],char b[],char c[])
{
    int lena,lenb,len,t,i,r=0;
    lena=strlen(a);             //数字a的长度 
    lenb=strlen(b);             //数字b的长度 
    len=max(lena,lenb);         //两者中位数较大的数 
    strrev(a);                  //逆序 
    strrev(b);                  //逆序 
    for(i=0;i<len;i++)          //低位至高位 
    {
        if(i>=lena)             //若长度不足,在高位补0 
        a[i]='0';
        if(i>=lenb)             //若长度不足,在高位补0
        b[i]='0';
        t=r+(a[i]-'0')+(b[i]-'0');
        c[i]=t%10+'0';          //当前位 
        r=t/10;                 //进位 
    }
    if(r!=0)                    //最后可能还有进位 
    c[i++]=r+'0';
    
    c[i]='\0';                  //结尾 
    strrev(c);                  //逆序回正常 
}
int main()
{
    char a[N],b[N],c[N];
    scanf("%s %s",a,b);
    add(a,b,c);
    puts(c);                                                                                            
    return 0;
}