Description
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
Output
Sample Input
1.1 2.9 1.1111111111 2.3444323343 1 1.1
Sample Output
4 3.4555434454 2.1
这个题真的是做哭了,妈呀,说多了都是泪啊,各种细节错误,一直a不过,痛苦啊,当最后看到Accepted的时候,真的是感觉要哭了。。。。。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
char n1[410],n2[410];
while(~scanf("%s%s",n1,n2))
{
int N1[410]={0},N2[410]={0},result[410]={0};//把去掉小数点后的数字编程整数保存在N1和N2中
int n1p=0,n2p=0,length1,length2,i,j,int1,int2,point1,point2;
int maxpoint,maxint;//maxpoint小数部分最长的位数 ,maxint整数部分最长的位数
for(i=0;n1[i]!='\0';i++)
{
if(n1[i]=='.')
{
n1p=i;//确定n1小数点的位置
}
}
if(n1p==0)
{
n1p=i;
length1=i;
point1=0;
int1=i;
}
else
{
length1=i-1;//n1的长度
int1=n1p;//n1的整数部分的位数
point1=i-n1p-1;//n1的小数部分的位数
}
for(j=0;n2[j]!='\0';j++)
{
if(n2[j]=='.')
{
n2p=j;//确定n2小数点的位置
}
}
if(n2p==0)
{
n2p=j;
length2=j;
point2=0;
int2=j;
}
else
{
length2=j-1;//n2的长度
int2=n2p;//n2的整数部分的位数
point2=j-n2p-1;//n2的小数部分的位数
}
if(point1>point2)
maxpoint=point1;
else
maxpoint=point2;
//n2整数部分补零,并且把字符型数组变成int型数组
if(int1>int2)
{
maxint=int1;
int k=int1-int2,l,h;//k的值等于补完零以后的第一个数字的位置
for(l=0,h=k;l<n2p;h++,l++)//l为原来字符数组的位置,h为int数组的位置
{
N2[h]=n2[l]-'0';//把n2的整数部分变成int型,赋值给N2
}
for(i=0;i<n1p;i++)//把n1整数部分进行转变
N1[i]=n1[i]-'0';
for(j=n1p+1;j<length1+1;i++,j++)//把n1的小数部分进行转变
N1[i]=n1[j]-'0';
for(i=n2p+1;i<length2+1;i++)//把n2的小数部分进行转换
N2[h++]=n2[i]-'0';
}
//n1整数部分补零,并且把字符型数组变成int型数组
else
{
maxint = int2;
int k=int2-int1,l,h;//k的值等于补完零以后的第一个数字的位置
for(l=0,h=k;l<n1p;h++,l++)//l为原来字符数组的位置,h为int数组的位置
{
N1[h]=n1[l]-'0';//把n1的整数部分变成int型,赋值给N1
}
for(i=0;i<n2p;i++)//把n2整数部分进行转变
{
N2[i]=n2[i]-'0';
}
for(j=n2p+1;j<length2+1;i++,j++)//把n2的小数部分进行转变
{
N2[i]=n2[j]-'0';
}
for(i=n1p+1;i<length1+1;i++)//把n1的小数部分进行转换
{
N1[h]=n1[i]-'0';
h++;
}
}
//进行加法运算
int jinwei=0,extra=0;
for(int k=maxint+maxpoint-1;k>=0;k--)
{
result[k]=(N1[k]+N2[k]+jinwei)%10;
jinwei=(N1[k]+N2[k]+jinwei)/10;
}
extra=jinwei;
//进行输出,注意输出最简形式,注意012.012300,22.00
int temp=0,nn=0;
if(extra)
printf("%d",extra);
for(i=0;i<maxint;i++)
printf("%d",result[i]);
for(i=maxint+maxpoint-1;i>=maxint;i--)
{
if(result[i]==0 && temp==0);
else
{
temp=1;
nn=i;
break;
}
}
if(nn==0)
{
cout<<endl;
}
else
{
cout<<".";
for(i=maxint;i<=nn;i++)
cout<<result[i];
cout<<endl;
}
}
return 0;
}