话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于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
题解:
模拟加法运算
思想很简单,就是细节比较繁琐
我的建议就是做一步,然后输出中间值来检查是否达到自己预期效果,如果达不成,则反复修改,直到完成预期效果
不要等到代码全部写完,再去判断结果对不对
代码:
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;
int main(){
string a,b;
int az[500],ay[500];
int bz[500],by[500];
int sumz[500],sumy[500];
int flag=0;//flag判断小数点后是否进位
while(cin>>a>>b){
memset(az,0,sizeof(az));
memset(ay,0,sizeof(ay));
memset(bz,0,sizeof(bz));
memset(by,0,sizeof(by));
memset(sumz,0,sizeof(sumz));
memset(sumy,0,sizeof(sumy));
flag=0;
int flagflag=0;
int flaga=0,flagb=0;//分别标记a,b小数点的位置
for(int i=0;i<a.length();i++){
if(a[i]=='.'){
flagflag=1;
flaga=i;//找a的小数点的位置
break;
}
}
if(flagflag==0){
flaga=a.length();
}
flagflag=0;
for(int i=0;i<b.length();i++){
if(b[i]=='.'){
flagflag=1;
flagb=i;//找b的小数点的位置
break;
}
}
if(flagflag==0){
flagb=b.length();
}
int leny,lenay,lenby;
int lenz,lenaz,lenbz;
lenay=a.length()-flaga-1;
lenaz=flaga;
lenby=b.length()-flagb-1;
lenbz=flagb;
leny=lenay>lenby?lenay:lenby;//右边数的最长长度
lenz=lenaz>lenbz?lenaz:lenbz;//左边数的最长长度
//cout<<leny<<endl;
//cout<<lenz<<endl;
int lenyflag=leny;
int lenzflag=lenz;
for(int i=flaga+1;i<a.length();i++){
lenyflag--;
if(i>flaga+1+leny){
ay[lenyflag]=0;
}
else{
ay[lenyflag]=a[i]-'0';
}
}
/*for(int i=0;i<leny;i++){
cout<<ay[i];
}
cout<<endl;*/
lenyflag=leny;
for(int i=flagb+1;i<b.length();i++){
lenyflag--;
if(i>flagb+1+leny){
by[lenyflag]=0;
}
else{
by[lenyflag]=b[i]-'0';
}
}
/*for(int i=0;i<leny;i++){
cout<<by[i];
}*/
int j=0;
for(int i=flaga-1;i>=0;i--){
az[j++]=a[i]-'0';
}
/*for(int i=0;i<lenz;i++){
cout<<az[i];
}
cout<<endl;*/
j=0;
for(int i=flagb-1;i>=0;i--){
bz[j++]=b[i]-'0';
}
/*for(int i=0;i<lenz;i++){
cout<<bz[i];
}*/
flagflag=0;
for(int i=0;i<leny-1;i++){
sumy[i]=ay[i]+by[i];
if(sumy[i]>9){
sumy[i]=sumy[i]-10;
ay[i+1]++;
}
}
sumy[leny-1]=ay[leny-1]+by[leny-1];
if(sumy[leny-1]>9){
flagflag=1;
sumy[leny-1]-=10;
}
if(leny==1){
sumy[0]=ay[0]+by[0];
if(sumy[0]>9){
sumy[0]-=10;
flagflag=1;
}
}
//cout<<flagflag<<endl;
for(int i=0;i<leny;i++){
if(sumy[i]==0){
sumy[i]=10;
}
else{
break;
}
}
int ifdoz=0;
for(int i=0;i<leny;i++){
if(sumy[i]!=10){
ifdoz=1;
}
}
az[0]=az[0]+flagflag;
for(int i=0;i<lenz-1;i++){
sumz[i]=az[i]+bz[i];
if(sumz[i]>9){
sumz[i]-=10;
az[i+1]++;
}
}
sumz[lenz-1]=az[lenz-1]+bz[lenz-1];
if(sumz[lenz-1]>9){
sumz[lenz-1]-=10;
sumz[lenz]=1;
lenz++;
}
for(int i=lenz-1;i>=0;i--){
cout<<sumz[i];
}
if(ifdoz==1){
cout<<".";
for(int i=leny-1;i>=0;i--){
if(sumy[i]!=10){
cout<<sumy[i];
}
}
}
cout<<endl;
}
return 0;
}