M - 大明A+B
HDU-1753
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做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
解法:高精度计算,用长度为1000的数组来存储,前500位存整数部分,后500位存小数部分,输出的情况很多需要注意。
代码:
#include<iostream>
#include<cstring>
using namespace std;
char str1[500],str2[500];
int x[1000],y[1000],z[1000];
void op()
{
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(y,0,sizeof(z));
int a,b;
a=strlen(str1);
if(strchr(str1,'.')!=NULL){
b=strchr(str1,'.')-str1;
for(int i=b-1;i>=0;i--)
x[501-b+i]=str1[i]-'0';
for(int i=b+1;i<a;i++)
x[500+i-b]=str1[i]-'0';
}
else
for(int i=a-1;i>=0;i--)
x[501-a+i]=str1[i]-'0';
a=strlen(str2);
if(strchr(str2,'.')!=NULL){
b=strchr(str2,'.')-str2;
for(int i=b-1;i>=0;i--)
y[501-b+i]=str2[i]-'0';
for(int i=b+1;i<a;i++)
y[500+i-b]=str2[i]-'0';
}
else
for(int i=a-1;i>=0;i--)
y[501-a+i]=str2[i]-'0';
int c=0;
for(int i=999;i>=0;i--){
z[i]=x[i]+y[i]+c;
c=z[i]/10;
z[i]%=10;
}
}
int main()
{
while(cin>>str1>>str2){
op();
int flag=0;
int f=-1;
for(int i=0;i<=500;i++){
if(z[i]!=0){
f=i;
break;
}
}
if(f==-1)
cout<<0;
else
for(int i=f;i<=500;i++){
if(z[i]!=0)
flag=1;
if(flag==0)
continue;
else
cout<<z[i];
}
f=-1;
for(int i=999;i>500;i--){
if(z[i]!=0){
f=i;
break;
}
}
if(f!=-1){
cout<<".";
for(int i=501;i<=f;i++){
cout<<z[i];
}
}
cout<<endl;
}
}
网友评论