使用数组存储大数

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 来计算 ab 的长度,但您不存储 a 的长度。因此,如果他们键入两个长度不等的数字,那么您将得到奇怪的结果。

第一个数字丢失是因为循环:

for (;i!=0; --i)

这将针对值 ii-1i-2、...、1 执行。它从不执行 i == 0for 循环每次迭代结束时的操作顺序是:

  • 应用第三个条件--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] 的数组具有从 0100 的有效索引。但是 p101 开始。

注意。大数代码通常解决不同大小输入问题和其他一些问题的方法是让 a[0] 成为最低有效位;然后你可以在加法或乘法时扩展到你需要去的未使用的地方。