大数相加

大数加法的其他方法

1;这种方法应该是与上次大数阶乘的方法类似吧,也是用一个int数组来存这个数,每个数组元素都存储几位数。并且进位;

2;不过这个我们不需要考虑数组元素进位的问题,因为把数组开得很大,只需要进位就可以了,只是在输出的时候要注意一下,不是按原来的方法输出了,大有不同了;

3;先看一下核心代码,
k = 0;
for(i = 0; i <= 500; i++){
ss[i] = aa[i]+bb[i]+k;
k = 0;
k = ss[i]/10;
ss[i] = ss[i]%10;
}
刚才说的把数组元素开得很大,就是这里的500了。

4;说一些刚打代码时出的问题吧。
(1;初始化要注意,要用的数组一般都要初始化的,

(2;还有一点是,并不是初始化都可以成功的,这点我搞了好久,才想起上次也就是这个出了问题,找学长帮忙的。就是在外面将字符串初始化为0;然后后面再使用,那么当字符串数组开得很大,后面的0再进行运算的时候就乱套了。

(3;
Memset(,0.)按照这样进行初始化;
for(i = 0; i <= 500; i++){
ss[i] = (aa[i]-‘0’)+(bb[i]-‘0)’+k;}
到了后面就乱了。
这种情况应该是只能将字符串变成int数组类型吧。我是用的for进行一一转变;

for(i = 0; i < strlen(a); i++){//不能直接将字符串初始化为0;注意; 
    aa[i] = a[i]-'0';
}

5;还有就是刚刚说的输出问题;
这里的输出要与前面的思路相一致;因为数组元素开得很大,并且都进行了循环,因此要找到要输出数字的下标;怎么找就是把前面是0的都不要输出,从第一个不是0的数开始输出;

for(i = 500; ; i--){
    if(ss[i] != 0){
        break;
    }
}
for( ; i != -1; i--){
    printf("%d",ss[i]);
}

6;是不是也想把这个存储一位的变成存储两位 的,刚试了一下,又放弃了,可是可以的只是又大动手术感觉有回到原来的思路上去了。
摆代码吧;

#include<stdio.h>
#include<string.h>
int main()
{
    char a[1002]={0}, b[1002]={0};
    int i, j, k, ss[505], aa[1002]={0}, bb[1002]={0};
    while(scanf("%s",a) != EOF){
        memset(ss, 0, sizeof(ss));
        scanf("%s",b);
        strrev(a);
        strrev(b);
        for(i = 0; i < strlen(a); i++){//不能直接将字符串初始化为0。注意; 
        aa[i] = a[i]-'0';
    } 
    for(i = 0; i < strlen(b); i++){
    bb[i] = b[i]-'0';
    } 
    k = 0;
    for(i = 0; i <= 500; i++){
        ss[i] = aa[i]+bb[i]+k;
        k = 0; 
        k = ss[i]/10;
        ss[i] = ss[i]%10;
    }
    for(i = 500; ; i--){
        if(ss[i] != 0){
            break;
        }
    }
    for( ; i != -1; i--){
        printf("%d",ss[i]);
    }
    printf("\n");
    memset(aa, 0, sizeof(aa));
    memset(bb, 0, sizeof(bb));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值