高精度加法运算
程序员文章站
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; }
上一篇: 如何构建多模块的SpringBoot项目
下一篇: Changing ColorSpaces