我是C编程的新手。 我已经写了这个代码用于添加两个100位的数字,但我不知道为什么代码不能正常工作,它假设移动进位但它没有。 另一个问题是它只是忽略了第一个数字(最重要的数字)。 请有人帮帮我吗?
#include <stdio.h>
#include <ctype.h>
int sum[101] = {0};
int add(int a, int b);
void main()
{
static int a[100];
static int b[100];
char ch;
int i = 0;
int t;
for (t = 0; t != 100; ++t)
{
a[t] = 0;
}
for (t = 0; t != 100; ++t)
{
b[t] = 0;
}
do
{
ch = fgetc(stdin);
if ( isdigit(ch) )
{
a[i] = ch - 48;
++i;
}
else
break;
}
while (ch != '\n' || i == 100 || i != '\0');
i = 0;
do
{
ch = fgetc(stdin);
if ( isdigit(ch) )
{
b[i] = ch - 48;
++i;
}
else
break;
}
while (ch != '\n' || i == 100 || i != '\0');
for (;i!=0; --i)
{
add(a[i], b[i]);
}
for (i==0;i != 101; ++i)
{
printf("%d", sum[i]);
}
}
int add( int a , int b)
{
static int carry = 0;
float s = 0;
static int p = 101;
if (0 <= a+b+carry <= 9)
{
sum[p] = (a + b + carry);
carry = 0;
--p;
return 0;
}
else
{
if (10 <= a+b+carry < 20)
{
s = (((a+b+carry)/10.0 ) - 1) * 10 ;
carry = ((a+b+carry)/10.0) - (s/10);
}
else
{
s = (((a+b+carry)/10 ) - 2) * 10;
carry = ((a+b+carry)/10.0) - (s/10);
}
sum[p] = s;
--p;
return 0;
}
}
答案 0 :(得分:2)
您的输入循环存在严重问题。您还可以使用i
来计算a
和b
的长度,但不要存储a
的长度。因此,如果他们输入两个长度不相等的数字,那么你会得到奇怪的结果。
第一个数字的丢失是因为循环:
for (;i!=0; --i)
这将针对值i
,i-1
,i-2
,...,1
执行。它永远不会与i == 0
一起执行。 for
循环每次迭代结束时的操作顺序为:
--i
i != 0
这是一些固定的代码:
int a_len;
for (a_len = 0; a_len != 100; ++a_len)
{
int ch = fgetc(stdin); // IMPORTANT: int, not char
if ( ch == '\n' || ch == EOF )
break;
a[a_len] = ch;
}
同样适用于b
。事实上,将此代码设为函数是一个明智的想法,而不是将其复制粘贴并将a
更改为b
。
输入完成后,您可以写:
if ( a_len != b_len )
{
fprintf(stderr, "My program doesn't support numbers of different length yet\n");
exit(EXIT_FAILURE);
}
for (int i = a_len - 1; i >= 0; --i)
{
add(a[i], b[i]);
}
转到add
函数,这里存在更严重的问题:
20
s = a+b+carry - 10; carry = 1;
可以达到你想要的效果。sum
的范围:大小为[101]
的数组具有有效索引0
到100
。但p
从101
开始。 NB。大数字代码通常解决不同大小输入问题的方式以及其他一些问题,就是a[0]
是最不重要的数字;然后,只要在添加或乘法时,就可以扩展到未使用的位置。