大明A+B
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8353 Accepted Submission(s): 2946
Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
Sample Input
1.1 2.9 1.1111111111 2.3444323343 1 1.1
Sample Output
4 3.4555434454 2.1解题分析:题目大意就是大数相加的问题,不过在此题中要注意到给出的书是否带小数点,同时,带小数的对于整数部分为0的,输出0;思路:对于整数部分,倒着记录,病从小往大相加,对于小数部分,从正着记录,从大往小加。代码比较长:#include<stdio.h> #include<string.h> int main() { char s1[440]; char s2[440]; int a1[440],a2[440]; int b1[440],b2[440]; int c1[440],c2[440]; int i,j; int k1,k2; int sum1,sum2; int p,q,t; int len1,len2,len3,len4; int len5,len6; while(scanf("%s%s",s1,s2)!=EOF) { k1=k2=1; memset(a1,0,sizeof(a1)); memset(a2,0,sizeof(a2)); memset(b1,0,sizeof(b1)); memset(b2,0,sizeof(b2)); memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); len5=strlen(s1); len6=strlen(s2); i=0; sum1=0; while(s1[i]!='.'&&s1[i]!='\0') {sum1++;i++ ;} //找到小数点,记录位数 if(sum1==len5) k1=0; //同时标记是否为小数 j=0; sum2=0; while(s2[j]!='.'&&s2[j]!='\0') {sum2++;j++;}//找到小数点,记录位数 if(sum2==len6) k2=0; //同时标记是否为小数 i=0; j=sum1-1; while(j>=0) //用数组a1记录整数部分 { a1[i]=s1[j]-'0'; i++; j--; } i=0; j=sum2-1; while(j>=0) //用数组a2记录整数部分 { a2[i]=s2[j]-'0'; i++; j--; } if(k1==1) //第一个是小数,就用b1记录小数部分 { i=sum1+1; j=0; while(s1[i]!='\0') { b1[j]=s1[i]-'0'; j++; i++; } } if(k2==1) //第二个是小数,就用b1记录小数部分 { i=sum2+1; j=0; while(s2[i]!='\0') { b2[j]=s2[i]-'0'; j++; i++; } } len1=sum1; len3=sum2; len2=len5-1-sum1; len4=len6-1-sum2; if(k1==0&&k2==1) //一整,二小,总小数部分就是第二小数 { for(i=0;i<len4;i++) c2[i]=b2[i]; } if(k1==1&&k2==0) //二整,一小,总小数部分就是第一小数 { for(i=0;i<len2;i++) c2[i]=b1[i]; } if(len2>len4) { t=len2; len2=len4; len4=t; } if(k1==1&&k2==1) //先将小数部分相加 { q=0; for(j=len4-1;j>=0;j--) { t=b2[j]+b1[j]+q; c2[j]=t%10; q=t/10; } a1[0]+=q; //注意将小数最后一位进位进到整数部分 } if(len1>len3) { t=len1; len1=len3; len3=t; } p=0; for(j=0;j<len3;j++) //整数部分相加 { t=a2[j]+a1[j]+p; c1[j]=t%10; p=t/10; } c1[len3]=p; j=len3; while(c1[j]==0&&j>-1) j--; if(j==-1) printf("0"); else for(;j>=0;j--) printf("%d",c1[j]); if(!(k1==0&&k2==0)) { i=len4; while(c2[i]==0&&i>-1) i--; if(i>=0) { printf("."); for(j=0;j<=i;j++) printf("%d",c2[j]); } } printf("\n"); } return 0; }