大数加法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数加法相关的知识,希望对你有一定的参考价值。
问题:我有一个非常简单的问题给你。给定两个整数A和B,你的工作是计算A + B的总和
分析:不能定义两个整数去相加,当数太大后,数据就会溢出,比如:112233445566778899+998877665544332211。所以使用两个字符数组,将每一个数作为数组的一个元素存进去,然后再把两个字符数组相加存入一个结果的数组。
困难:两个数组相加,会存在进位和溢出
解决:将数组里面的元素倒过来然后相加,若进位了,设置一个判断是否进位的条件,若进位了acc=1,没进位acc=0,sum[i]=s1[i]-‘0‘+s2[i]-‘0‘+acc。
代码:
#include <stdio.h> #include<string.h> #include <stdlib.h> int main() { char s1[1000],s2[1000],sum[1001],s3[1000],s4[1000]; int t,x; void reverse(char*s); void add(char*s1,char*s2,char*sum); scanf("%d",&t); x=1; while(t--) { s1[1000]=‘0‘; s2[1000]=‘0‘; scanf("%s %s",s1,s2); strcpy(s3,s1); strcpy(s4,s2); add(s1,s2,sum); if(t!=0) printf("Case %d:\n%s + %s = %s\n\n",x,s3,s4,sum); else printf("Case %d:\n%s + %s = %s\n",x,s3,s4,sum); x++; } return 0; } void reverse(char*s) { int length; int i=0; char temp; length=strlen(s); while(i<length-i-1) { temp=s[i]; s[i]=s[length-i-1]; s[length-i-1]=temp; i++; } } void add(char*s1,char*s2,char*sum) { int len1=strlen(s1); int len2=strlen(s2); int acc=0,temp,i; reverse(s1); reverse(s2); for(i=0;i<len1 && i<len2;i++) { temp=s1[i]-‘0‘+s2[i]-‘0‘+acc; sum[i]=temp%10+‘0‘; if(temp>=10) acc=1; else acc=0; } if(i<len1) { for(;i<len1;i++) { temp=s1[i]-‘0‘+acc; sum[i]=temp%10+‘0‘; if(temp>=10) acc=1; else acc=0; } } if(i<len2) { for(;i<len2;i++) { temp=s2[i]-‘0‘+acc; sum[i]=temp%10+‘0‘; if(temp>=10) acc=1; else acc=0; } } if(acc==1) sum[i++]=‘1‘; sum[i]=‘\0‘; reverse(sum); }
以上是关于大数加法的主要内容,如果未能解决你的问题,请参考以下文章