2015-02-09 52 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'不是'void' – 2015-02-09 21:40:33

+0

'while(ch!='\ n'|| i == 100 || i!='\ 0');' - 這真的搞砸了 – 2015-02-09 21:44:30

+0

我知道,但我不認爲這與問題有任何關係。 – 2015-02-09 21:46:21

回答

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。但p開始於101

NB。大數據代碼通常處理不同大小輸入和其他問題的方式是使a[0]是最不重要的數字;那麼只要在添加或乘法時需要去,就可以擴展到未使用的地方。

+0

非常感謝你。 :) 問題解決了 :) – 2015-02-09 22:08:40