2.1
这道题。。。额,怎么说呢,就是一悲剧啊。
题目通俗易懂,说的在明白点就是高精度加法,
长度不大于400,显然大数问题,
这道题解法,要么对其小数点,然后开始加吧,
要么就是我这次做法:数分开存,加完了分别输出,
这题说难不难,说简单还真不简单(废话。。)
好吧,就是细心,各种情况都考虑考虑,
说半天废话,我就来个解题的关键吧:
神奇的测试数据:
前置0,后置0,第一个是小数点,相加进位等等:
1.0000000000000 3 .43
34345.34 32425345
8523400000 777.700
3435 4554
0.000 0.0000
99999 1
1.0001 2.9999
1.235262578623 2.29375824758243527200
23546756.345326547567454 .2142356754225653425346
00012.1 1.2000
99.0000001 0.9999999
.0 .0
答案:
1.43000000000003
32459690.34
8523400777.7
7989
0
100000
4
3.529020826205435272
23546756.5595622229900193425346
13.3
100
0
代码:
// 大明A+B
#include <iostream>
#include <string>
using namespace std;
string zs[3],xs[3];
int len_zs1,len_zs2,len_zs3;
int len_xs1,len_xs2,len_xs3;
void deal(string str,int k)
{
int len,dian;
int i;
len=str.length();
dian=-1;
for(i=0;i<len;++i)
if(str[i]==‘.‘)
dian=i;
// 如果不存在小数点,即全为整数
if(dian==-1)
{
zs[k]=str;
xs[k]="0";
}
// 如果没有整数
else if(dian==0)
{
zs[k]="0";
xs[k]=str.substr(dian+1,len);
}
else
{
zs[k]=str.substr(0,dian);
xs[k]=str.substr(dian+1,len);
}
// 求各部分长度
len_zs1=zs[0].length();
len_zs2=zs[1].length();
len_xs1=xs[0].length();
len_xs2=xs[1].length();
}
// 求整数部分
void find_zs()
{
int i,j;
zs[2]="";
if(len_zs1>=len_zs2)
{
for(i=0;i<len_zs1-len_zs2;++i)
zs[2]+=zs[0][i];
for(j=0;j<len_zs2;++i,++j)
zs[2]+=(zs[0][i]+zs[1][j]-‘0‘);
for(i=len_zs1-1;i>0;--i)
if(zs[2][i]>‘9‘)
{
zs[2][i]-=10;
zs[2][i-1]+=1;
}
if(zs[2][0]>‘9‘)
{
zs[2][0]-=10;
zs[2]="1"+zs[2];
}
}
else
{
for(i=0;i<len_zs2-len_zs1;++i)
zs[2]+=zs[1][i];
for(j=0;j<len_zs1;++i,++j)
zs[2]+=(zs[0][j]+zs[1][i]-‘0‘);
for(i=len_zs2-1;i>0;--i)
if(zs[2][i]>‘9‘)
{
zs[2][i]-=10;
zs[2][i-1]+=1;
}
if(zs[2][0]>‘9‘)
{
zs[2][0]-=10;
zs[2]="1"+zs[2];
}
}
}
// 求小数部分
void find_xs()
{
int i,j;
xs[2]="";
if(len_xs1>=len_xs2)
{
for(i=0,j=0;j<len_xs2;++i,++j)
xs[2]+=(xs[0][i]+xs[1][j]-‘0‘);
for(;i<len_xs1;++i)
xs[2]+=xs[0][i];
for(i=len_xs1-1;i>0;--i)
if(xs[2][i]>‘9‘)
{
xs[2][i]-=10;
xs[2][i-1]+=1;
}
if(xs[2][0]>‘9‘)
{
xs[2][0]-=10;
zs[0][len_zs1-1]+=1;
}
}
else
{
for(i=0,j=0;i<len_xs1;++i,++j)
xs[2]+=(xs[0][i]+xs[1][j]-‘0‘);
for(;j<len_xs2;++j)
xs[2]+=xs[1][j];
for(i=len_xs2-1;i>0;--i)
if(xs[2][i]>‘9‘)
{
xs[2][i]-=10;
xs[2][i-1]+=1;
}
if(xs[2][0]>‘9‘)
{
xs[2][0]-=10;
zs[0][len_zs1-1]+=1;
}
}
}
// 判断小数是否为0
bool judge_xs(void)
{
int i;
for(i=0;i<len_xs3;++i)
if(xs[2][i]!=‘0‘)
return 0;
return 1;
}
void xiuzheng(void)
{
// 小数尾部0去除
int i;
for(i=len_xs3-1;i>=0;--i)
if(xs[2][i]!=‘0‘)
break;
if(i!=len_xs3-1)
xs[2]=xs[2].substr(0,i+1);
// 小数位数长度若改变,要更新
len_xs3=xs[2].length();
// 整数头部0去除
for(i=0;i<len_zs3;++i)
if(zs[2][i]!=‘0‘ || i==len_zs3-1)
break;
if(i!=0)
zs[2]=zs[2].substr(i,len_zs3-1);
len_zs3=zs[2].length();
}
int main()
{
string str1,str2;
bool iszero;
while(cin>>str1>>str2)
{
deal(str1,0);
deal(str2,1);
// 先求小数部分,再求整数部分,小数会有进位
find_xs();
find_zs();
len_zs3=zs[2].length();
len_xs3=xs[2].length();
xiuzheng();
iszero=judge_xs();
if(iszero) cout<<zs[2]<<endl;
else cout<<zs[2]<<"."<<xs[2]<<endl;
}
return 0;
} ACM-简单题之大明A+B——hdu1753,布布扣,bubuko.com
原文:http://blog.csdn.net/lttree/article/details/20941007