Добавьте два больших числа, используя массив

0

Извините за мой английский. Я написал программу, которая добавляет два больших числа. Номер 1 считывается из файла data1.in, то же самое со вторым, data2.in. Проблема была, когда я попытался добавить 68925579999999999990+79925579999999999990 Я получаю неправильный результат: 48951159999999999980. используя python, чтобы добавить эти цифры, у меня есть 148851159999999999980. Где я ошибся??

#include <iostream.h>
#include <fstream.h>
#include<math.h>

int n = 0;
int m = 0;
const int zerou = 9000;


//using namespace std;

void zero(int*a)
{
     for(int i = 0;i<zerou;i++)
    a[i]=0;
}



void zero(int*a,int*b)
{
    for(int i = 0;i<zerou;i++)
    a[i]=b[i]=0;
}


void rebuild(int* a)
{
    int temp[9000];
    zero(temp);
    int i;

    int delta = abs(m-n)+1;//k1 -dim a
    for(i = delta;i<n+delta;i++)
    {
        temp[i] = a[i-delta];
        a[i-delta] = 0;
    }
    n += delta;
    for(i =0;i<n;i++)
    a[i] = temp[i];


}



void rebuildS(int* a)
{
    int temp[9000];
    zero(temp);
    int i;

    int delta = abs(m-n)+1;//k1 -dim a
    for(i = delta;i<m+delta;i++)
    {
    temp[i] = a[i-delta];
    }

    m += delta;
    for(i =0;i<m;i++)
    a[i] = temp[i];
}


void citirea(int* ar){
    ifstream f;

    f.open("data1.in");
    int data;
    while (f>>data){
    ar[n++] = data;
    }
    f.close();
}

void citirea_(int* ar){
    ifstream f("data2.in");
    int data;
    while (f>>data){
    ar[m++] = data;
    }
    f.close();
}

/*
void perDig(int*a, int*b,int *t,int i)
{
*t += (a[i]+b[i])/10;
a[i] = (a[i]+b[i]+*t)%10;

}*/


void adunarea(int*a, int* b)
{
    int transport = 0;
    int sum;

    for(int i = n;i>=0;i--)
    {
        sum = a[i]+b[i]+transport;
        //sum = perDig(a,b,transport,i);
        if(sum >9)
        {
            transport = (sum)/10;
            sum %=10;
          }
          a[i] = sum;

    }


}



int main()
{
    int a[9000],b[9000];
    zero(a,b);

    citirea(a);
    citirea_(b);

    if(n > m)
        rebuildS(b);

    else if(m > n)
         rebuild(a);
     adunarea(a,b);


ofstream rez;
rez.open("data.out");
for(int i = 0;i<m;i++)
{
 rez<<a[i]<<" ";

}        

rez.close();
cin.get();
  return 0;
}
  • 0
    Какое это имеет отношение к Python? Или C, в этом отношении?
  • 3
    <iostream> и <fstream> не имеют расширений .h. Фактически, ни один из стандартных заголовков, представленных в C ++, не имеет расширения.
Показать ещё 11 комментариев
Теги:

1 ответ

1
Лучший ответ

В вашем ответе есть две ошибки. если (! sum> 9), вы не обнуляете транспорт, поэтому числа переносятся навсегда. Вы будете иметь одну цифру, потому что вы добавляете N цифр и не учитываете Nth + 1 цифру в ответе, если транспорт! = 0.

Однако у вас есть большая проблема. Вы не знаете, как отлаживать код самостоятельно. Если вы сомневаетесь, заставьте программу сказать вам каждый шаг, который она выполняет, и прочитайте, что она говорит, и посмотрите, где это происходит. Зная, как это сделать, стоит более 10 правильных версий вашего кода.

void adunarea(int*a, int* b)
{
    int transport = 0;
    int sum;

    for(int i = n;i>=0;i--)
    {
        cout << a[i] << " + " << b[i] << " + " << transport << endl;
        sum = a[i]+b[i]+transport;
        if(sum >9)
        {
            transport = (sum)/10;
            sum %=10;
        }
        a[i] = sum;
        cout << " = " << sum << " ( " << transport << " )" << endl;
    }
}

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

  • 2
    Есть ряд других проблем. Если вы только изучаете C ++ (или программирование), вы захотите изучить правильную технику. Так что некоторые вещи с кодом, который был опубликован, неправильны: 1. форматирование - выберите стиль и используйте его последовательно. Это сделает ваш код проще для чтения и отладки. 2. глобальные переменные - старайтесь их избегать. 3. «магические числа» - вы определили постоянную zerou что хорошо, но затем использовали 9000 много мест в коде. 4. нет полезных комментариев - комментарии помогут вам (и другим) понять код. напишите их на своем родном языке или английском Удачи!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню