LETTers比赛第三场 --1003 大明A+B解题报告
报告人:侯建鹏
报告日期:2012/4/16
1003 大明A+B
解题思路:模拟
我的方法很简单,就是不停的模拟、模拟、再模拟。
首先,把每个数都分成两部分,整数部分和小数部分,即a_h_count、a_l_count、b_h_count、b_l_count。相信只要细心一些都可以做出来的。
然后,把模拟人工计算过程,先加小数位,加完之后,产生的对整数位的进位再和两个数的整数部分相加,最后把零去掉,输出就可以了。
关键是:一定要细心!!!
详见代码。
#include<stdio.h> #include<string.h> #define N 400+10 char a[N],b[N]; int a_h[N],a_l[N],b_h[N],b_l[N],h[N],l[N],h_count,l_count; int Judge(char *a) { int i=0; while(a[i]!='.'&&a[i]!=0) i++; return i; } int Change1(char *a,int *a_h,int a_point) { int i,j=0; for(i=a_point-1;i>=0;i--) { a_h[j]=a[i]-'0'; j++; } return j; } int Change2(char *a,int *a_l,int a_point ) { int i,j=0; if(a[a_point]==0) return 0; for(i=a_point+1;a[i]!=0;i++) { a_l[j]=a[i]-'0'; j++; } return j; } int max(int a,int b) { return a>b?a:b; } int main() { int i; int a_point,b_point,a_h_count,b_h_count, a_l_count,b_l_count; while(scanf("%s%s",a,b)==2) { memset(a_h,0,sizeof(a_h)); memset(b_h,0,sizeof(b_h)); memset(a_l,0,sizeof(a_l)); memset(b_l,0,sizeof(b_l)); memset(h,0,sizeof(h)); memset(l,0,sizeof(l)); a_point=Judge(a); b_point=Judge(b); a_h_count=Change1(a,a_h,a_point); b_h_count=Change1(b,b_h,b_point); a_l_count=Change2(a,a_l,a_point); b_l_count=Change2(b,b_l,b_point); h_count=max(a_h_count,b_h_count); l_count=max(a_l_count,b_l_count); //printf("%d\n",a_l_count); //printf("%d\n",b_l_count); //printf("%d\n",l_count); for(i=l_count-1;i>=0;i--) { if(i==0) { l[i]+=a_l[i]+b_l[i]; h[0]+=l[i]/10; l[i]=l[i]%10; } else { l[i]+=a_l[i]+b_l[i]; l[i-1]+=l[i]/10; l[i]=l[i]%10; } } for(i=0;i<h_count;i++) { h[i]+=a_h[i]+b_h[i]; h[i+1]+=h[i]/10; h[i]=h[i]%10; } if(h[h_count]!=0) h_count++; i=l_count-1; while(l[i]==0&&i>=0) { l_count--; i--; } i=h_count-1; while(h[i]==0&&i>=1) { h_count--; i--; } for(i=h_count-1;i>=0;i--) printf("%d",h[i]); if(l_count>0) { printf("."); for(i=0;i<l_count;i++) printf("%d",l[i]); } printf("\n"); //printf("l_count=%d\n",l_count); } return 0; }