Как мне добавить два больших неотрицательных целых числа, используя массив символов в C? - PullRequest
1 голос
/ 03 апреля 2019

Я делаю программу для добавления двух больших неотрицательных целых чисел (каждое большое целое число содержит не более 100 цифр).В моей программе, однако, в большинстве случаев он выдает неверные результаты.

Я выполнил функцию main(), но я считаю, что проблема с моим кодом заключается в функции AddTwoBigNumbers().

#include <stdio.h>

const int MAX_INT_LENGTH = 100;

void AddTwoBigNumbers(char bigN[], char bigM[], char sum[]) {
    int i = 0;
    int index = 0;
    int count = 0;
    int index2 = 0;
    while (1) {
        int sum1 = count;
        if (bigM[index]) {
            sum1 += bigM[index] - '0';
            index++;
        }
        if (bigN[index2]) {
            sum1 += bigN[index2] - '0';
            index2++;
        }
        sum[i] = sum1 % 10 + '0';
        i++;
        count = sum1 / 10;
        if (bigM[index] == 0 && bigN[index2] == 0) {
            break;
        }
    }
    if (count) {
        sum[i] = count + '0';
        i++;
    }
    sum[i] = 0;

    int x, len = 0;
    for (x = 0; sum[x]; ++x) {
        ++len;
    }

    for (x = 0; x < len / 2; ++x) {
        sum[len] = sum[x];
        sum[x] = sum[len - x - 1];
        sum[len - x - 1] = sum[len];
    }
}

int main() {
    char bignum[2][MAX_INT_LENGTH]; // bignum[0] and bignum[1] are to store the digits of the two input number
    char sum[MAX_INT_LENGTH + 1];     // to store the sum of the two big numbers

    // read in two numbers
    scanf("%s", bignum[0]);
    scanf("%s", bignum[1]);

    // calculate sum of the two numbers
    AddTwoBigNumbers(bignum[0], bignum[1], sum);

    // display the sum on screen
    printf("%s\n", sum);

    return 0;
}

Примеры приведены ниже:

Вход:

1
999999999999999999999999999

Выход:

1000000000000000000000000000

Мой вывод:

1000000000000000000000000000

Вход:

999999999999999999999999999
999999999999999999999999999

Выход:

1999999999999999999999999998

Мой вывод:

1999999999999999999999999989

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

В программе, которую вы разместили, вы сначала рассматриваете наиболее значимые цифры.

Попробуйте сначала рассмотреть наименее значимые цифры, а затем перейти к более значимым цифрам.

Примите во внимание значения переноса, которые могут быть сгенерированы, и добавьте их к следующему набору значений исоответственно сбросьте значение переноса.

Помните, что числа обрабатываются как символы.Вычтите '0' из символа, когда вам нужно целочисленное значение, и преобразуйте их обратно в символьную форму, добавив '0'.

. Отрегулируйте для случаев, когда длины bigM и bigN не совпадаюттакже.

Если все цифры bigM превышены, используйте значения bigN и значение переноса, если оно есть, для вычисления всех оставшихся цифр sum и наоборот.

И, наконец, после того, как все цифры обоих входных номеров исчерпаны, проверьте, есть ли еще оставшийся перенос, и добавьте это также к sum.

Вы можете вычислять и вставлять значения в sum в обратном порядке и переверните строку позже, если хотите.

Не забудьте прекратить nul ('\0') sum в конце.


Youможет сделать что-то вроде

void AddTwoBigNumbers(char bigN[], char bigM[], char sum[])
{
    int i=strlen(bigM)-1, j=strlen(bigN)-1, k, carry=0;
    for(k=0; i>=0 && j>=0; --i, --j, ++k)
    {
        sum[k] = (bigM[i]-'0' + bigN[j]-'0' + carry)%10 + '0';
        carry = (bigM[i]-'0' + bigN[j]-'0' + carry)/10;
    }

    for(; i>=0; --i, ++k)
    {
        sum[k] = (bigM[i]-'0' + carry)%10 + '0'; 
        carry = (bigM[i]-'0' + carry)/10;
    }
    for(; j>=0; --j, ++k)
    {
        sum[k] = (bigN[j]-'0' + carry)%10 + '0'; 
        carry = (bigN[j]-'0' + carry)/10;
    }
    if(carry!=0)
    {
        sum[k++]=carry+'0';
    }
    sum[k]=0;

    //Reversing string
    for(int t=0; t<n/2; ++t)
    {
        char temp=sum[t];
        sum[t]=sum[n-1-t];
        sum[n-1-t]=temp;
    }
}
1 голос
/ 03 апреля 2019

Ваша функция добавляет два целых числа слева направо.Попробуйте этот метод, это алгоритм, который добавляет сзади вперед (параметры массива обычно ухудшаются до указателей, поэтому char *bigN здесь равно char bigN[]):

void AddTwoBigNumbers(char *bigN, char *bigM, char* sum)
{
    int add = 0;
    int index = 0;
    int count = 0;
    int nbigN = strlen(bigN)-1;
    int nbigM = strlen(bigM)-1;
    while (nbigN >= 0 || nbigM >= 0)
    {
        int N = 0, M = 0;
        if (nbigN >= 0)
        {
            N = bigN[nbigN] - '0';
            nbigN--;
        }
        if (nbigM >= 0)
        {
            M = bigM[nbigM] - '0';
            nbigM--;
        }
        add = N + M + count;
        sum[index++] = add % 10 + '0';
        count = add / 10;
    }
    if (count)
        sum[index++] = count + '0';
    sum[index] = 0;
    int nsum = strlen(sum);
    for (int i = 0, j = nsum - 1; i < j; i++, j--)
    {
        char c = sum[i];
        sum[i] = sum[j];
        sum[j] = c;
    }
}

РЕДАКТИРОВАТЬ:

int strlen(char* buf)
{
    int len = 0;
    if (buf == NULL)
        return len;
    while (*buf++)
        len++;
    return len;
}
...