大数相加方法------1

大数相加

1;大数,什么是大数,就是不能再用什么(int ,long long int, double)等等数据类型来保存了的数字;这简单,不能用这些我们很快的可以想到用数组存起来不就可以了吗;

2;存大数的确很简单,那大数的四则运算了;大数的加法呢;我们可以很快的也有了想法;那不就是把数组的对应位相加如果大于10就进一不就OK了;的确思维确实是这样的,但是知道想法是简单的打起代码来就不简单了哦;不信可以试试;

3;打代码是会出现的问题;
(1怎么输入,已什么形式输入;等下怎么处理;
(2长的,短的怎么去加啊;
(3高位与低位搞晕了;
(4进位可能会出错;
这些都是我第一次打的时候遇到的问题;在这里一一搞清楚;

我有几种代码先说第一种是这么解决这些问题的;
1;输入当然用字符串输入啊

    while(scanf("%s",a) != EOF){ 
        scanf("%s",b);
    }

2;长短;这个容易,直接在前面来个比较;进行赋值

        lena = strlen(a);
        lenb = strlen(b);
        if(lena < lenb){//换边。将长的放在前面; 
            strcpy(t, b);
            strcpy(b, a);
            strcpy(a,t);
            m = lenb;
            lenb = lena;
            lena = m;
        }

3;现在我们已经把长的数组放在了前面a,短的放在了后面,先在就可以模拟了;

(1;因为我们是%s输入的因此高位就是数组下标小的,也就是a[0]是这个数的最高位,同理b也是这样的,高位在数组的前面,因此我们在计算的时候要要从最后面开始。当然下标肯定不是lena和lenb啊;似不似啊,这点有时候打快了就变成了从lena,lenb开始了,不是从那里开始啊,是从lena-1,lenb-1开始啊!这点是个细节。

(2;还有就是计算应该分成两个部分去做,一部分是计算两个数组 重合的部分,另外一部分就是还有一个长点的数组剩余的部分。

(3;怎么进位呢?这里是个小技巧,看下面代码细想一下就知道了;

        jzs = 0;
        l = 0;
        for(i = lena-1, j = lenb-1; j != -1; i--, j--){//计算公共部分。也就是数组短的那部分 
            wsh = (a[i]-'0')+(b[j]-'0')+jzs;
            //printf("%d\n",wsh);
            if(wsh > 9){
                jzs = 1;
                wsh = wsh%10;
            }
            else jzs = 0;
            k[l] = wsh;
            l++;
        }
        for(; i != -1; i--){//数组长的剩余的部分 
            wsh = (a[i] - '0')+jzs;
            if(wsh > 9){
                jzs = 1;
                wsh = wsh%10;
            }
            else jzs = 0;
            k[l] = wsh;
            l++;
        }

进位技巧在于这里;
**wsh = (a[i]-‘0’)+(b[j]-‘0’)+jzs;
还有就是在循环外面记得初始化;里面进位要考虑其wsh是否大于9**

            wsh = (a[i] - '0')+jzs;
            if(wsh > 9){
                jzs = 1;
                wsh = wsh%10;
            }
            else jzs = 0;
            k[l] = wsh;
            l++;

这里要注意的是if那里配对的else,要记得将jzs初始化0一下,在不进位的情况下。
(4;还有一点就是在输出的时候要记得考虑一下进位数jzs是否为0 如果为0就要单独提前输出一下,

        if(jzs == 1){//考虑最后一位是否进位了 
            k[l] = 1;
            l++;
        }

细节都说完了,摆出代码了;

#include<stdio.h>
#include<string.h> 
int main()
{
    int lena, lenb, m, i, j, l, jzs, c, wsh, k[1000];
    char a[1000], b[1000], t[1000];
    while(scanf("%s",a) != EOF){ 
        scanf("%s",b);
        lena = strlen(a);
        lenb = strlen(b);
        if(lena < lenb){//换边。将长的放在前面; 
            strcpy(t, b);
            strcpy(b, a);
            strcpy(a,t);
            m = lenb;
            lenb = lena;
            lena = m;
        }
        jzs = 0;
        l = 0;
        for(i = lena-1, j = lenb-1; j != -1; i--, j--){//计算公共部分。也就是数组短的那部分 
            wsh = (a[i]-'0')+(b[j]-'0')+jzs;
            //printf("%d\n",wsh);
            if(wsh > 9){
                jzs = 1;
                wsh = wsh%10;
            }
            else jzs = 0;
            k[l] = wsh;
            l++;
        }
        for(; i != -1; i--){//数组长的剩余的部分 
            wsh = (a[i] - '0')+jzs;
            if(wsh > 9){
                jzs = 1;
                wsh = wsh%10;
            }
            else jzs = 0;
            k[l] = wsh;
            l++;
        }
        if(jzs == 1){//考虑最后一位是否进位了 
            k[l] = 1;
            l++;
        }
        for(c = l-1; c != -1; c--){
            printf("%d",k[c]); 
        }
        printf("\n");
    }

    return 0 ;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值