使用数组来存储大数字

时间:2015-02-09 21:39:46

标签: c bignum

我是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;
    }
}

1 个答案:

答案 0 :(得分:2)

您的输入循环存在严重问题。您还可以使用i来计算ab的长度,但不要存储a的长度。因此,如果他们输入两个长度不相等的数字,那么你会得到奇怪的结果。

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

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

这将针对值ii-1i-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]的数组具有有效索引0100。但p101开始。

NB。大数字代码通常解决不同大小输入问题的方式以及其他一些问题,就是a[0]是最不重要的数字;然后,只要在添加或乘法时,就可以扩展到未使用的位置。