题目大意:给出不超过400位的正小数a和b,求a+b。 思路:分整数部分与小数部分分别做加法。注意小数部分到整数部分的进位。 i,j保存小数点位置或整数长度。需判断是否为纯整数。 注意最简形式最多只能简至小数点 #include <iostream> using namespace std; char a[401],b[401]; char ans[801]; int main() { int i,j,k,l,m,n; int la,lb; memset(a,'0',sizeof(a)); memset(b,'0',sizeof(b)); memset(ans,'0',sizeof(ans)); while(scanf("%s%s",&a,&b)!=EOF) { la=strlen(a); lb=strlen(b); a[la]='0'; b[lb]='0'; i=j=0; while(a[i]!='.' && i<la) i++; while(b[j]!='.' && j<lb) j++; l=(la-i>lb-j? la-i:lb-j); m=(i>j?i:j); if(!(i==la) || !(j==lb)) n=m+l+1; else n=m+l; k=n; for(;l>0;k--,l--) { ans[k]+=a[i+l]+b[j+l]-'0'-'0'; if(ans[k]>'9') { ans[k-1]++; ans[k]-=10; } } if(ans[k]!='0') ans[k-1]='1'; if(!(i==la) || !(j==lb)) { ans[k]='.'; k--; } for(l=1;l<=m;l++,k--) { if(l<=i && l<=j) { ans[k]+=a[i-l]+b[j-l]-'0'-'0'; if(ans[k]>'9') { ans[k-1]++; ans[k]-=10; } } else if(l<=i) { ans[k]+=a[i-l]-'0'; if(ans[k]>'9') { ans[k-1]++; ans[k]-=10; } } else if(l<=j) { ans[k]+=b[j-l]-'0'; if(ans[k]>'9') { ans[k-1]++; ans[k]-=10; } } } if(!(i==la) || !(j==lb)) while(1) { if(ans[n]=='.') { n--; break; } else if(ans[n]=='0') n--; else break; } ans[n+1]='/0'; if(ans[0]=='0') printf("%s/n",ans+1); else printf("%s/n",ans); memset(a,'0',sizeof(a)); memset(b,'0',sizeof(b)); memset(ans,'0',sizeof(ans)); } return 0; }