///////////////////////////////////////////////////////////////////////////////////////////////////////////////// //变态 //////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include <iostream> #include <cstdio> #include <string> // #include <cstring> using namespace std; const int MAXSIZE = 100; //就是这儿,你一开始设置小点,运算快,之后别忘了改过来嘛#1 int main() { string str1; string str2; // string str3; //就是不知道为啥数组不能用#2 int arr3[MAXSIZE]; int m; int n; while(cin>>str1) { cin>>str2; for(int i=0; i<str1.size(); ++i) { if(str1[i]=='.') //得区分小数点前和小数点后,小数点后补零对齐#3 { m=i; break; } } for(int i=0; i<str2.size(); ++i) { if(str2[i]=='.') { n=i; break; } } int diff=str1.size()-str2.size()-m+n; //给小数点后短的补零#6 if(diff>0) { for(int i=0; i<diff; ++i) //这里必须提前确定好范围,要不str越加越长#4 { str2+="0"; //拼接得是字符串,得用双引号“”#5 } } else { for(int i=0; i<-diff; ++i) { str1+="0"; } } int p=str1.size()-1; //str1从最右到左的序号#7 int q=str2.size()-1; //str2从最右到左的序号#8 int k=0; //进位#9 int i=0; while(p>=0&&q>=0) //有一个算完了退出来#10 { if(str1[p]!='.') //要是碰到小数点得留一个小数点的位置#11 { // str3[i]=((str1[p]-'0')+(str2[q]-'0'))%10+k+'0'; //反正就是不知道字符串str3为什么不行#12 arr3[i]=((str1[p]-'0')+(str2[q]-'0')+k)%10; //求余数,余数就是这个位的值#13 if(str1[p]+str2[q]-'0'-'0'+k>=10) //大于10就进位#14 { k=1; } else { k=0; } } else { arr3[i]=-1; // str3[i]='.'; } --p; //这种东西最麻烦了#15 --q; ++i; } if(p==-1) //把多余的补上#16 { while(q>=0) { arr3[i]=str2[q]-'0'+k; //刚才的进位也得加上#17 k=0; //就很烦,每次都得加一遍,所以设为0#18 // str3+=str2[q]; q--; i++; } } else { while(p>=0) { arr3[i]=str1[p]-'0'+k; k=0; i++; // str3+=str1[p]; p--; } } for(i=i-1; i>=0; --i) { if(arr3[i]==-1) //小数点必须有#19 { cout<<'.'; } else { cout<<arr3[i]; } // cout<<str3[i]; } cout<<endl; } }