大数加法的其他方法
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));
}
}