C语言大数加法的一个疑问求解

henhaowoxini 2020-02-13 06:26:09
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,k,n,m,a[110],b[110],max,c[110];
char s[110],ss[110];
while(gets(s),gets(ss))
{
k=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
n=strlen(s);
m=strlen(ss);
for(i=n-1;i>=0;i--)
a[k++]=s[i]-'0';//逆序存储,以便相加的时候从个位开始相加
k=0;
for(i=m-1;i>=0;i--)
b[k++]=ss[i]-'0';
max=n;
if(m>max)
max=m; //找到两个数中较长的那个
for(i=0;i<max;i++)
{
c[i]=a[i]+b[i]+c[i];
if(c[i]>=10)
{
c[i]=c[i]-10;
c[i+1]++;
}
}
while(c[max-1]==0&&max!=1)//去掉前缀0
max--;
for(i=max-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
return 0;
}


其中while(c[max-1]==0&&max!=1)//去掉前缀0
max--;
这两句起到什么作用,没有明白
...全文
132 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
qybao 2020-02-14
  • 打赏
  • 举报
回复
这个注释就已经写的很明白了,是去掉前缀的0,只是处理不对
LS说的是一种情况,但如果输入合法数据
比如输入 s="9", ss="98",为了方便说明,把长度110改为5
保存到数组
a={9,0,0,0,0},b={8,9,0,0,0},max=2,max在红字位置
相加结果
c={7,0,1,0,0}; max在红字位置
要去掉前面的0,只需要定位max的位置,然后从max倒序
while(c[max]!=0&&max<数组长度5) max++; 就可以了,因为上面红字位置为'1', 所以while循环成立,max变为3,即蓝色的位置 {'7','0','1',0,0},然后退出while循环
所以 for(i=max-1;i>=0;i--) 倒序输出(从上面的蓝色位置减1位开始,也就是就max-1开始)就可以得出结果

所以如果s和ss输入前面带0的数据,应该要去掉后再存入a和b才是正确的处理方法

coo135 2020-02-14
  • 打赏
  • 举报
回复
别人写的程序,全靠猜。我猜1:防止输入0003 5 输出 0008;2:判断是否有进位~~不过写的是错的,应该将:
while(c[max-1]==0&&max!=1)//去掉前缀0
max--;
for(i=max-1;i>=0;i--)

改为:
while(c[max]==0&&max!=0)//判断是否有进位,并去掉前缀0
max--;
for(i=max;i>=0;i--)

70,037

社区成员

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

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