2012-12-16 151 views
1

我正在想辦法添加這兩個大數字,但奇怪的是輸出是71717171 ... 71 ...(重複)。你能告訴我的代碼有什麼問題嗎? (我是很新的編碼,所以如果有任何失誤請給有益的建議。)這段代碼有什麼問題?

#include <iostream> 

int main() { 
    using namespace std; 
    char a[] = "37107287533902102798797998220837590246510135740250"; 
    char c[] = "46376937677490009712648124896970078050417018260538"; 
    char carry[52]; 
    int p[52], q, r; 
    carry[0] = 0; 
    for (int b = 49; b >= 0; b--) 
    for (q = 0; q < 51; q++) { 
     p[q] = (((static_cast<int>(a[b] + c[b])) - 96) % 10) + static_cast<int>(carry[q]); 
     (carry[q + 1]) = (static_cast<int>(a[b] + c[b]))/10; 
    } 
    for (r = 0; r < 51; r++) { 
     cout << p[r]; 
    } 
    cin.clear(); 
    cin.get(); 
} 
+6

這是代碼高爾夫比賽嗎? – 0x499602D2

+0

我得到'b'遍歷所有的數字,但是'q'做什麼?當您添加兩個數字時,您不會將一個數字的每個數字添加到另一個數字的每個數字,只是對應的數字。 –

+1

爲什麼你添加了嵌套for循環? – dmckee

回答

1

我建議你在什麼你是如何加入再看看。特別是,我建議以學校 - 男孩的方式來做:從一開始就向上向上一列。

因此,像這樣:

char p[strlen(a)+2]; // In the same representation as a and c 
p[strlen(a)+1]='\0'; // make sure p is null terminated 
p[0] = '0'; // make sure the first digit of p is zero if we don't carry into it 
int carry = 0; 
for (int b=strlen(a); b>=0; --b) { 
    int digit1 = a[b] - '0'; 
    int digit2 = c[b] - '0'; 
    int raw_result = digit1 + digit2 + carry; 
    int result = raw_result % 10; 
    carry = raw_result/10; 
    p[b+1] = result + '0'; // Question for the student: why p+1? 
} 
if (carry != 0) p[0] = carry; 

那麼還有什麼我已改變?

  • 我對這些數字進行了非常詳細的解碼,並使用'0'來獲取要減去的值。這使得我正在做的更清楚,並且意味着我不必每次回想每次使用時要減去的東西。
  • 我已經跳過了一些環節,以確保結果(p)足夠長,並具有正確的開始和結束值。

還存在哪些不足?

  • 它只適用於兩個輸入的長度相同。對學生提出的問題:你如何解決這個問題?
  • 使用strlen的長度是非常低效的。你如何修復
  • 與長度問題相關的是,你如何處理不需要的前導零?這表明閱讀順序字符串可能不是您的BigNums的最佳代表性格式。什麼會更好?
+0

-1將準備好的代碼提供給** [作業](http:// stackoverflow .com/questions/13903137/whats-wrong-with-this-code/13903176#comment19158756_13903213)**問題。這很愚蠢,而且與幫助OP的情況恰恰相反。 –

0

三個問題: - 你是不是減去96,而計算矣。 - 您必須以相反的順序顯示數字。 - 你必須將其設置

試試這個顯示上次進:

#include <iostream> 

int main() { 
    using namespace std; 
    char a[] = "37107287533902102798797998220837590246510135740250"; 
    char c[] = "46376937677490009712648124896970078050417018260538"; 
    char carry[52]; 
    int p[52], q, r; 
    carry[0] = 0; 
    q = 0; 
    for (int b = 49; b >= 0; b--) { 
     p[q] = (((static_cast<int>(a[b] + c[b])) - 96) % 10) + static_cast<int>(carry[q]); 
     (carry[q + 1]) = ((static_cast<int>(a[b] + c[b])) - 96)/10; 
     q++; 
    } 
    if(carry[51] == 1) { 
     count << carry[51]; 
    } 
    for (r = 50; r >= 0; r--) { 
     cout << p[r]; 
    } 
    cin.clear(); 
    cin.get(); 
} 
+0

你仍然有嵌套循環。你爲什麼要添加一個嵌套循環?這不是乘法。 – dmckee

+0

-1您是否認爲將準備好的解決方案發布到**作業問題**是智能的? –

+0

此代碼無法正常工作,不要擔心我不會作弊 –

1

盪滌你的代碼位:

#include <iostream> 

int main() { 
    using namespace std; 
    char a[] = "37107287533902102798797998220837590246510135740250"; 
    char c[] = "46376937677490009712648124896970078050417018260538"; 
    char carry[51]; 
    int p[51], q, r; 
    p[0] = 0; 
    carry[50] = 0; 
    int sum = 0; 
    for (q = 50; q > 0; q--) { 
    sum = ((int)a[q-1]+ (int)c[q-1]) - 96; 
    p[q] = sum % 10 + carry[q]; 
    carry[q-1] = sum/10; 
    } 
    p[0] = carry[0]; 
    for (r = 0; r < 51; r++) { 
    cout << p[r]; 
    } 
    cin.clear(); 
    cin.get(); 
} 

注意,這僅適用於50位數字的作品,並且可以有一個前導零,如果有最顯著的總和不進數字。你可能想要使它更通用。

+0

這實際上是一個功課題嗎?我在這個問題中沒有看到任何跡象。 –