大数加法 (A + B Problem II)
现在的题目,感觉大数加法用的还是很少了,但还是在这里介绍一道最基础的题目。
题目:hdu 1002 (http://acm.hdu.edu.cn/showproblem.php?pid=1002)
解法:大数加法
注意:需要注意的是,应该与大数乘法连起来一起看,你会发现它们之间进位的关系,加法最多只会进位1,但是乘法就会进位大于1。这是它们之间的区别
代码:
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #define MAX 1000 char a[MAX+1],b[MAX+1]; int T; int main() { scanf("%d",&T); for(int w=1;w<=T;++w) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); scanf("%s%s",a,b); printf("Case %d:\n",w); printf("%s + %s = ",a,b); int len1=strlen(a); int len2=strlen(b); int fpla=MAX-( len1>len2 ? len1:len2); for(int i=len1-1,k=MAX;i>=0;--i,--k) a[k]=(a[i]-'0'),a[i]=0; for(int i=len2-1,k=MAX;i>=0;--i,--k) b[k]=(b[i]-'0'),b[i]=0; for(int i=MAX;i>=fpla;--i) a[i]+=b[i]; for(int i=MAX;i>=fpla;--i) { int c=a[i]/10; a[i-1]+=c; a[i]%=10; } for(int i=fpla+1;i<=MAX;++i) printf("%d",a[i]); puts(""); if(w<T) puts(""); } return 0; }
纯净版的无添加原生代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int main() { ios::sync_with_stdio(false); //freopen("in.txt","r",stdin); char s1[1000]; char s2[1000]; int a[1000] = {0}; int b[1000] = {0}; int sum[1000] = {0}; cin >> s1 >> s2; int lenA = strlen(s1) - 1; int lenB = strlen(s2) - 1; int k = 0; int maxx = max(lenA,lenB); for(int i=lenA;i>=0;i--) //两个for循环,将数组的高低位置反 a[k++] = s1[i] - '0'; k = 0; for(int i=lenB;i>=0;i--) b[k++] = s2[i] - '0'; int carry = 0; //carry表示进位标识符 for(int i=0;i<=maxx;i++) { int tmp1 = a[i] + b[i] +carry; sum[i] = tmp1%10; if(tmp1 >=10) //如果相加大于10,表示有进位 carry = 1; else carry = 0; } if(carry == 1) printf("1"); //如果最后,A,B的最高为相加有进位的话,那么可以单独输出 for(int i=maxx;i>=0;i--) printf("%d",sum[i]); return 0; }
posted on 2018-08-07 18:24 superhero11 阅读(254) 评论(0) 编辑 收藏 举报