题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1753
#include <iostream>
#include <string>
using namespace std;
int findpoint(string str) //找到小数点在字符串中的位置
{
int i;
for(i=0; i<(int)str.length(); i++)
{
if(str[i]=='.')
return i;
}
return i;
}
string IntegerAdd(string s1,string s2,int point1,int point2) //将整数部分相加,返回结果
{
string a=s1.substr(0,point1);
string b=s2.substr(0,point2);
if(point1<point2) //确保a为较长的串
{
string tempstr;
int temp;
tempstr=a;
a=b;
b=tempstr;
temp=point1;
point1=point2;
point2=temp;
}
for(int i=(int)a.length()-1,j=(int)b.length()-1; j>=0; i--,j--)//将b的每一位与‘0’的差值加到a中
{
a[i]+=b[j]-'0';
}
for(int i=a.length()-1; i>=1; i--) //处理进位---加法是从右往左算的,进位也是
{
if(a[i]>'9')
{
a[i-1]++;
a[i]-=10;
}
}
if(a[0]>'9')
{
a[0]-=10;
a='1'+a;
}
return a;
}
string DecimalAdd(string &s1,string &s2,int point1,int point2)
{
//取小数点后的字符串
string a;
if(point1<(int)s1.length()-1)
a=s1.substr(point1+1,s1.length()-1-point1);
string b;
if(point2<(int)s2.length()-1)
b=s2.substr(point2+1,s2.length()-1-point2);
//确保a为较长的串
if(s1.length()-point1<s2.length()-point2)
{
string tempstr;
int temp;
tempstr=a;
a=b;
b=tempstr;
temp=point1;
point1=point2;
point2=temp;
}
/*
这里要注意,string.length()是unsigned类型,与int类型的j计算时,如果j是负数,会转化为比较大的无符号值,
所以要对它进行类型强转
*/
for(int i=0,j=0; j<=(int)b.length()-1; i++,j++) //从前往后,确保小数位对齐
{
a[i]+=b[j]-'0';
}
for(int i=a.length()-1; i>=1; i--) //从后往前逐一进位,除了第一个小数位
{
if(a[i]>'9')
{
a[i-1]++;
a[i]-=10;
}
}
if(a[0]>'9') //判断第一个小数位
{
a[0]-=10;
s1[point1-1]++; //原字符串小数点前一位加1
}
return a;
}
int main ()
{
string s1,s2;
int point1;
int point2;
string B; //小数位
string A; //整数位
while(cin>>s1>>s2)
{
point1=findpoint(s1); //找到小数点
point2=findpoint(s2);
B=DecimalAdd(s1,s2,point1,point2);
A=IntegerAdd(s1,s2,point1,point2);
int i;
for(i=B.length()-1; i>=0; i--) //从后向前,找到第一个不为0的字符
if(B[i]!='0')
break;
if(i<0)
cout<<A<<endl;
else
{
cout<<A<<'.';
for(int j=0;j<=i;j++)
cout<<B[j];
cout<<endl;
}
}
return 0;
}