大数相加

来源:互联网 发布:芒果tv没有mac版 编辑:程序博客网 时间:2024/06/08 06:35

大数加法的其他方法

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));    }}
1 0
原创粉丝点击