使用数组存储大数
using array to store big numbers
我是 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 != '[=10=]');
i = 0;
do
{
ch = fgetc(stdin);
if ( isdigit(ch) )
{
b[i] = ch - 48;
++i;
}
else
break;
}
while (ch != '\n' || i == 100 || i != '[=10=]');
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;
}
}
你的输入循环有严重的问题。您还使用 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
开始。
注意。大数代码通常解决不同大小输入问题和其他一些问题的方法是让 a[0]
成为最低有效位;然后你可以在加法或乘法时扩展到你需要去的未使用的地方。
我是 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 != '[=10=]');
i = 0;
do
{
ch = fgetc(stdin);
if ( isdigit(ch) )
{
b[i] = ch - 48;
++i;
}
else
break;
}
while (ch != '\n' || i == 100 || i != '[=10=]');
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;
}
}
你的输入循环有严重的问题。您还使用 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
开始。
注意。大数代码通常解决不同大小输入问题和其他一些问题的方法是让 a[0]
成为最低有效位;然后你可以在加法或乘法时扩展到你需要去的未使用的地方。