大数和之添加了小数问题

                                        杭电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 ;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值