求助哪里错了?

heyifeng 2011-05-17 04:49:42
#include<stdio.h>
#include<string.h>

#define LEN 100
#define MAX 100
#define IN 1
#define OUT 0


int main (void)
{
int i;
int j;
char a1[LEN];
char b1[LEN];
int a[LEN];
int b[LEN];
int statue;
int lens1, lens2;

memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
scanf("%s", a1);
scanf("%s", b1);
lens1 = strlen(a1)-1;
lens2 = strlen(b1)-1;

j = 0;
for(i = lens1; i >= 0; i--)
{
a[j++] = a1[i] - '0';
}
j = 0;
for(i = lens2; i >= 0; i--)
{
b[j++] = b1[i] - '0';
}
for(i = 0; i < MAX; i++)
{
a[i] += b[i];
if(a[i] >= 10)
{
a[i] -= 10;
a[i+1]++;
}
}


statue = OUT;
for(i = MAX; i >= 0; i--)
{
if(statue)
{
printf("%d", a[i]);
}
else if(a[i])
{
printf("%d", a[i]);
statue = IN;
}

}
putchar('\n');


}
大整数加法的问题,为什么讲MAX改小比如50 才能得出结果。
小弟新手
不解..求帮助 谢谢

...全文
65 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
duzhl 2011-05-17
  • 打赏
  • 举报
回复
for(i = 0; i < MAX; i++)
{
a[i] += b[i];
if(a[i] >= 10)
{
a[i] -= 10;
a[i+1]++;//会越界 }
}

for(i = MAX; i >= 0; i--)//i=MAX时,a[i]会越界 {
if(statue)
{
printf("%d", a[i]);
}
else if(a[i])
{
printf("%d", a[i]);
statue = IN;
}

}
heyifeng 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 heartwasnot 的回复:]
C/C++ code
for(i = 0; i < MAX; i++)
{
a[i] += b[i];
if(a[i] >= 10)
{
a[i] -= 10;
a[i+1]++;
}
}

这里会出现越界。。。自己看看为什么。。


是不是当两个100位的数相加 如果结果大于100位就越界了?
HeartWasNot 2011-05-17
  • 打赏
  • 举报
回复
for(i = 0; i < MAX; i++)
{
a[i] += b[i];
if(a[i] >= 10)
{
a[i] -= 10;
a[i+1]++;
}
}
这里会出现越界。。。自己看看为什么。。


for(i = MAX; i >= 0; i--)
{
if(statue)
{
printf("%d", a[i]);
}
else if(a[i])
{
printf("%d", a[i]);
statue = IN;
}

}
putchar('\n');
这里也会越界。。。因为你len为100 MAX也为100 a[MAX]表示的是a的第101个元素。。所以会有问题。。
千杯不醉-sen 2011-05-17
  • 打赏
  • 举报
回复
给你个例子,参考一下。简单修改就可一实现大数相加。。。

#include <stdio.h>

int per[10000];
int total;


void fact(int number)

{

int i,j,temp,flag;

per[0] = 1;

total = 1;

for (i=1,flag=0;i<=number;i++)

{

for (j=0,temp=0;j<total;j++)

{

temp = per[j]*i+flag;

per[j] = temp%10;

flag = temp/10;

}

while (flag)

{

per[total++] = flag%10;

flag /= 10;

}

}

}



void main()

{

int i,number;

printf("Input number:");

scanf("%d",&number);

fact(number);

printf("%d!=",number);

for (i=total-1;i>=0;i--)

{

printf("%d",per[i]);

}

printf("\n%d\n",total);

}
KID_coder 2011-05-17
  • 打赏
  • 举报
回复

statue = OUT;
for(i = MAX; i >= 0; i--)
{
if(statue) //statue不为0才打印
{
printf("%d", a[i]);
}
else if(a[i]) //a[i]不为0才设置statue=1,并开始打印
{
printf("%d", a[i]);
statue = IN;
}
//这里其实可以加个 else{} 好理解一点~ 也就是跳过后面a[i]等于0的情况,直到遇到a[i]不为0才开始打印

}
putchar('\n');

因为a[100]越界了~ main里面没有把a[100]设置成0,所以才会打印错误
heyifeng 2011-05-17
  • 打赏
  • 举报
回复
嗯 我好好研究一下 谢谢了
bdmh 2011-05-17
  • 打赏
  • 举报
回复
过大,可能你没处理越界问题吧,可能会遇到垃圾字符,你跟踪试试吧,试着把数组初始化为0,相加给你个参考

//相加
char* AddNum(char* a,char* b)
{
int maxlen = max(strlen(a),strlen(b));
//多申请两个字符,一个是结束符'\0',一个是放到第一个字符,当两个数最高位相加后,如果有进位,保存到这里
char* p = new char[maxlen+2];
//为最后一位写上结束符
*(p+maxlen+1)='\0';
//声明两个指针分别指向a和b的末尾,不包含结束符
char* pA=a+strlen(a)-1;
char* pB=b+strlen(b)-1;
int m=0;
int n=0;
//进位
int c=0;
for (int i=maxlen;i>0;i--)
{
m = n = 0;
//因为当pA到达第一个字符时,即pA=a时,也要进行计算,所以这里用(pA-1)来判断
//因为字符'0'的Asic是48,所以1就是49,要转成数字,就要减去48
if ((pA+1) != a)
{
m = *pA - 48;
pA--;
}
if ((pB+1) != b)
{
n = *pB - 48;
pB--;
}
//为p指针的第i个字符赋值
*(p+i) = (m+n+c) % 10 + 48;
//取得进位
c = (m+n+c) / 10;
}
*p = 48+c;
return p;
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧