题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1753
题目大意:求两个长小数的和
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#define eps 1e-6
#define INF (1<<20)
#define PI acos(-1.0)
using namespace std;
char a[600],b[600];
int lena,lenb,inta[600],intb[600],ans[600];
int main()
{
while(scanf("%s%s",a,b)!=EOF)
{
memset(inta,0,sizeof(inta));
memset(intb,0,sizeof(intb));
memset(ans,0,sizeof(ans));
lena=strlen(a);
lenb=strlen(b);
int i=lena-1;
while(a[i]!='.')
i--;
int tempa;
if(i<0)
{
tempa=0;
lena++; //如果是整数,统一起来
}
else
tempa=lena-1-i;
int j=lenb-1;
while(b[j]!='.')
j--;
int tempb;
if(j<0)
{
tempb=0;
lenb++;
}
else
tempb=lenb-1-j;
int later=max(tempa,tempb); //最大的小数点后面的位数
for(i=later,j=lena-tempa;i>=1&&j<lena;i--)
{
inta[i]=a[j]-'0';
j++;
} //小数点后面的
for(i=1,j=later+1;i<=lena-1-tempa;i++,j++)
inta[j]=a[lena-1-tempa-i]-'0';//小数点前面的
int temp=j-1;
for(i=later,j=lenb-tempb;i>=1&&j<lenb;i--)
{
intb[i]=b[j]-'0';
j++;
}
for(i=1,j=later+1;i<=lenb-1-tempb;i++,j++)
intb[j]=b[lenb-tempb-1-i]-'0';
if(j-1>temp)
temp=j-1;
for(i=1;i<=temp;i++)
{
ans[i]+=inta[i]+intb[i];
if(ans[i]>=10)
ans[i+1]=ans[i]/10;
ans[i]=ans[i]%10;
}
while(ans[i]==0&&i>later+1)//去掉前置零,注意只能去掉小数点前一位前的零
i--;
if(i<=0)
{
printf("0\n");
continue;
}
for(j=1;ans[j]==0&&j<=later;j++);//去掉后置零,注意是小数点后面的零
for(;i>=j;i--)
{
if(i==later)
putchar('.');
printf("%d",ans[i]);
}
putchar('\n');
}
return 0;
}
/*
0.001 0.009
99999 1
1.0 9
12 245
*/