话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做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.45554344542.1
参考:利用1000的大空间来分段处理。
#include<cstdio> #include<iostream> #include<cstring> #define Max 1010 char str1[Max],str2[Max],ans[Max],temp1[Max],temp2[Max]; void Calculate() { int i,j,k,p,q,n,s,c; memset(str1,0,sizeof(str1)); memset(str2,0,sizeof(str2)); memset(ans,0,sizeof(ans)); n=strlen(temp1); if(strchr(temp1,'.')==NULL) k=n; else k=strchr(temp1,'.')-temp1; for(i=k-1,j=500;i>=0;i--,j++) str1[j]=temp1[i]-'0'; for(i=k+1,j=499;i<n;i++,j--) str1[j]=temp1[i]-'0'; n=strlen(temp2); if(strchr(temp2,'.')==NULL) k=n; else k=strchr(temp2,'.')-temp2; for(i=k-1,j=500;i>=0;i--,j++) str2[j]=temp2[i]-'0'; for(i=k+1,j=499;i<n;i++,j--) str2[j]=temp2[i]-'0'; c=0; for(i=0;i<1010;i++) { s=str1[i]+str2[i]+c; ans[i]=s%10; c=s/10; } return ; } void Output() { int i,j; for(i=1009;i>500;i--) if(ans[i]) break; for(;i>=500;i--) printf("%d",ans[i]); for(j=0;j<500;j++) if(ans[j]) break; if(j!=500) { printf("."); for(i=499;i>=j;i--) printf("%d",ans[i]); } printf("\n"); } int main() { while(~scanf("%s %s",&temp1,&temp2)) { Calculate(); Output(); } return 0; }
自己的还没找出错误:
//先将小数变成整数 #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <cctype> #include <iostream> #include <algorithm> #include <stack> #include <set> #include <map> #include <string> using namespace std; #define pi acos(-1,0) #define INF 2147483647 int max(int a,int b) { return a>=b?a:b; } int main() { int l1,l2,x1,x2,z1,z2,maxx,maxz; int i,j,flag; char s1[850],s2[850]; int ss1[850],ss2[850]; int ans[850]; while(scanf("%s %s",s1,s2)!=EOF) { memset(ss1,0,sizeof(ss1)); memset(ss2,0,sizeof(ss2)); memset(ans,0,sizeof(ans)); l1=strlen(s1); l2=strlen(s2); flag=0; if(s1[0]=='0' && s2[0]=='0' && l1==l2 && l1==0) { printf("0\n"); continue; } for(i=0;i<l1;i++) { if(s1[i]=='.') break; } if(i!=l1) { x1=l1-i-1; z1=i; } else { x1=0; z1=i; } for(i=0;i<l2;i++) { if(s2[i]=='.') break; } if(i!=l2) { x2=l2-i-1; z2=i; } else { x2=0; z2=i; } maxx=max(x1,x2); maxz=max(z1,z2); for(i=z1-1,j=0;i>=0;i--,j++) { ss1[maxz-j]=s1[i]-'0'; } for(i=l1-x1,j=1;i<l1;i++,j++) { ss1[maxz+j]=s1[i]-'0'; } // for(i=0;i<=maxx+maxz;i++) // printf("%d",ss1[i]); for(i=z2-1,j=0;i>=0;i--,j++) { ss2[maxz-j]=s2[i]-'0'; } for(i=l2-x2,j=1;i<l2;i++,j++) { ss2[maxz+j]=s2[i]-'0'; } // for(i=0;i<=maxx+maxz;i++) // printf("%d",ss2[i]); for(i=maxx+maxz;i>0;i--) { if(ss1[i]+ss2[i]>9) { ss1[i-1]++; ans[i]=ss1[i]+ss2[i]-10; } else ans[i]=ss1[i]+ss2[i]; } for(i=maxx+maxz;i>maxz;i--) { if(ans[i]!=0) { flag=1; break; } } for(i=maxx+maxz;i>=0;i--) { if(ans[i]!=0) break; } j=i; for(i=0;i<=j;i++) { if(i==0 && ans[0]!=0) printf("%d",ans[i]); else if(i==maxz && flag==1) { printf("%d",ans[i]); printf("."); } else if(i!=0) printf("%d",ans[i]); } printf("\n"); } return 0; }