您的位置:首页 > 其它

大数和之添加了小数问题

2016-04-21 14:41 302 查看
杭电1753 大明A+B


Problem Description

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。

这时他已经不是那个只会做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

1;一个大数问题,应该是比较简单的大数问题,然而我被搞了好久,太坑了,也主要是自己,没有细心吧,好多细节之前都没考虑到,只有wa后才去检查出来的。

2;说一下这题要注意的方面吧,

第一;小数点前面的数和后面的数相加的方法是不同的。这里要注意。

第二点;就是要注意输出的时候,小数点后的后置0是不输出的,

第三;就是小数点后的第一位进位是进到小数点前一位上的,要记得考虑;

3,这题细节就这么多,我主要花在打代码和修改上面去得多点点。记得打代码的时候一定要细心,

感觉自己有好多次变量乱用了,数组下标乱用了,特别 要注意。

4;哦,还有就是记得要初始化了;

摆代码吧;

#include<stdio.h>
#include<string.h>
int main()
{
int sza[505], szb[505], xsa[505], xsb[505], szh[505], xsh[505];
int lensa, lensb, max, i, j, k, l, la, lb, lena, lenb,ll,flag;
char a[505], b[505];
while(scanf("%s",a) != EOF){
scanf("%s",b);
memset(sza, 0, sizeof(sza));
memset(szb, 0, sizeof(szb));
memset(xsa, 0, sizeof(xsa));
memset(xsb, 0, sizeof(xsb));
lena = strlen(a);
lenb = strlen(b);
for(i = 0; i < lena; i++){
if(a[i] == '.')     break;
sza[i] = a[i]-'0';
lensa = i;
}
la = 0;
for(i++; i < lena; i++){
xsa[la] = a[i]-'0';
la++;
}
for(i = 0; i < lenb; i++){
if(b[i] == '.')     break;
szb[i] = b[i]-'0';
lensb = i;
}
lb = 0;
for(i++; i < lenb; i++){
xsb[lb] = b[i]-'0';
lb++;
}
//////////求小数部分的和
max = la;
if(lb > la){
max = lb;
}
l = 0;
k = 0;
flag = 0;
for(i = max-1; i != -1; i--){
xsh[l] = xsa[i]+xsb[i]+k;
k = xsh[l]/10;
xsh[l] = xsh[l]%10;
if(xsh[l] == 0){
flag++;
}
l++;
}

//////小数部分和打求出来了,留下了进位k;
ll = 0;
if(lensa >= lensb){
for(i = lensa,j =lensb; j != -1; i--,j--){
szh[ll] = sza[i]+szb[j]+k;
k = szh[ll]/10;
szh[ll] = szh[ll]%10;
ll++;
}
for( ; i != -1; i--){
szh[ll] = sza[i]+k;
k = szh[ll]/10;
szh[ll] = szh[ll]%10;
ll++;
}
if(k!=0){
szh[ll] = k;
ll++;
}
}
else{
for(i = lensb,j =lensa; j != -1; i--,j--){
szh[ll] = szb[i]+sza[j]+k;
k = szh[ll]/10;
szh[ll] = szh[ll]%10;
ll++;
}
for( ; i != -1; i--){
szh[ll] = szb[i]+k;
k = szh[ll]/10;
szh[ll] = szh[ll]%10;
ll++;
}
if(k!=0){
szh[ll] = k;
ll++;
}
}
/////
for(ll--; ll != -1; ll--){
printf("%d",szh[ll]);
}
if(flag == max){
printf("\n");
continue;
}
printf(".");
for(i = 0; i <= l-1; i++){
if(xsh[i] != 0){
break;
}
}
for(l--; l != i-1; l--){
printf("%d",xsh[l]);
}
printf("\n");
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: