2015-02-09 4 views
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 != '\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; 
    } 
} 
+2

использовать 'int main' not' void' –

+0

'while (ch! = '\ N' || i == 100 || i!= '\ 0'); '- это действительно перепутано –

+0

Я знаю это, но я не думаю, что это имеет какое-либо отношение к проблеме. –

ответ

2

Ваши входные петли имеют серьезную проблему. Также вы используете 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.

NB. Способ, которым код большого числа обычно решает проблемы ввода разного размера и некоторые другие проблемы, состоит в том, чтобы a[0] был наименее значащей цифрой; то вы можете просто перейти в неиспользуемые места, насколько вам нужно идти, когда вы добавляете или умножаете.

+0

спасибо очень. :) задача решена :) –

Смежные вопросы