77 大实数加法
作者: xxx时间限制: 1S章节: 字符串
问题描述 :
给你两个正的实数A和B,你的任务是计算出A+B的值。
输入说明 :
本题目包含T组测试数据。
每一组测试数据在一行里面包含两个长度不大于400的正实数A和B,A和B均无多余的前导0。
输出说明 :
对于每一组测试数据,请在一行里面输出输出A+B的值,行首与行尾均无空格。
运算结果最后的0(比如1.400)不需要输出(输出为1.4)。
输入范例 :
3
1.1 2.9
1.1111111111 2.3444323343
1 1.1
输出范例 :
4
3.4555434454
2.1
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
int i,az,bz,ax,bx,n,z,x,c;
string a,b,saz,sax,sbz,sbx,xiao,zheng;
scanf("%d",&n);
while(n--){
cin>>a>>b;
az = a.find(".");//a 的整数部分长度
if(az==-1){
az=a.length();
}
bz = b.find(".");
if(bz==-1){
bz=b.length();
}
ax = a.length() - az - 1;//a 的小数部分长度
if(ax<0){
ax=0;
}
bx = b.length() - bz - 1;
if(bx<0){
bx=0;
}
az > bz ? z = az : z = bz;
ax > bx ? x = ax : x = bx;
saz = a.substr(0, az);//a 的整数部分
if(ax==0){
sax = "0";//a 的小数部分
}else{
sax = a.substr(az + 1);//a 的小数部分
}
sbz = b.substr(0, bz);
if(bx==0){
sbx="0";
}else{
sbx = b.substr(bz + 1);
}
while (saz.size() != z)//整数部分补零
saz = "0" + saz;
while (sbz.size() != z)
sbz = "0" + sbz;
while (sax.size() != x)//小数部分补零
sax = sax + "0";
while (sbx.size() != x)
sbx = sbx + "0";
c = 0;
xiao = "",
zheng = "";
for ( i = x - 1; i >= 0; i--) {//字符转 int :char -‘0’;int 转字符:4 + ‘0’
xiao += ((c + (sax[i] - '0') + (sbx[i] - '0')) % 10 + '0');
c = (c + (sax[i] - '0') + (sbx[i] - '0')) / 10;
}
for ( i = z - 1; i >= 0; i--) {
zheng += ((c + (saz[i] - '0') + (sbz[i] - '0')) % 10 + '0');
c = (c + (saz[i] - '0') + (sbz[i] - '0')) / 10;
}
if(c!=0)
zheng += (c + '0');
int k;//小数部分去零
for (k=0;k<xiao.length();k++)
if (xiao[k] != '0')
break;
reverse(zheng.begin(), zheng.end());
cout << zheng;
if(k!=xiao.length()){
cout << ".";
for (i = xiao.length() - 1; i >= k; i--)
cout << xiao[i];
}
cout << endl;
}
return 0;
}