2014-04-08 41 views
-1

我試圖計算5個連續整數的乘積,但結果完全錯誤。我覺得我的邏輯是正確的,但爲什麼它讓我看到一個虛幻的數字:344362200在C中查找5個連續整數的乘積C

序列號是從1到10,代碼如下(僅僅是用於測試):

void problem8() 
{ 
    char *input = "123456789"; 
    char c; 
    int step = 5, i = 0, prod = 0, temp = 1; 
    for (; i < step; i++) 
    { 
     temp *= *(input + i); 
     printf("%d\n", temp); 
    } 
} 

輸出是真奇怪!在第一個循環中,結果是42 @@,而它應該只有1和1。我從*(輸入+ 0)或1 2 4等檢查了個別結果,這是正確的。但產品是錯誤的。

+2

那麼你去了,答案是42.不是它應該是49嗎?這是如果我編譯你的代碼。 – this

+4

嘗試'input [i] - '0''而不是'*(input + i)'。 – zwol

回答

4

您需要區分數字的代碼(對於'0'爲48,對於'1'等爲49)以及數字1,2等。您應該在第一次迭代中獲得49;事實上,我得到:

49 
2450 
124950 
6497400 
344362200 

如果你想第5個階乘,你需要使用temp *= input[i] - '0';(其中input[i]*(input + i),IMNSHO整潔)。

我給出的代碼對於代碼集(如ISO 8859-1)以及UTF-8和許多其他相關代碼集都是有效的。不過,它們不適用於EBCDIC。

2

問題是,您正在將char轉換爲int,並未考慮ASCII表中的ASCII偏移量。對於ASCII,整數開始於十六進制0x30

#include <stdio.h> 
#include <string.h> 

int multiplyFiveSingleDigitNumbersInAString (const char* input, size_t inputLength); 

int main(void) { 
    int tmp = 0; 
    const char* buf = "12345"; /* Create null-terminated string */ 
    tmp = multiplyFiveSingleDigitNumbersInAString(buf, strlen(buf)); 
    printf("Result of calculation for string %s is %d\n", buf, tmp); 
    return 0; 
} 

int multiplyFiveSingleDigitNumbersInAString (const char* input, size_t inputLength) { 
    if (inputLength != 5) { 
     printf("Wrong string length (%d), should be %d\n", (int)inputLength, 5); 
     return 0; 
    } 
    int i; 
    int multiSum = 1; 
    for (i=0; i<inputLength; i++) { 
     multiSum *= (int)input[i] - 0x30; 
    } 
    return multiSum; 
} 

參考

  1. ASCII表,訪問的2014年4月8日,<http://www.asciitable.com/>
+0

+1但是...我想知道設計決定在函數名稱中體現長度,特別是給出使用長度爲9的字符串而沒有不良影響的示例數據。函數'multiplySingleDigitNumbersInAString(const char * input,size_t len)'是有意義的; 'multiplySingleDigitNumbersInAString(const char * input)'也取整個字符串。你應該使用'0'代替0x30;那麼你的代碼也可以在EBCDIC機器上工作。如果你正在檢查長度,你應該檢查'數字'實際上是數字:'if(!isdigit((unsigned char)input [i]))return 0;'。 –

+0

此外,錯誤應打印到標準錯誤,而不是標準輸出。功能是否應該打印是有爭議的;如果它在靜默中返回一個明確的錯誤(-1不能合法,0可以是其中一個數字爲零)會更好。調用代碼然後可以報告問題。 –

+0

OP從未提及過字符串......問題涉及「5個連續的整數」。奇怪的是,人們在代碼中保留*一個錯誤的東西*並改變其餘部分,而不是相反。看到我的答案是一個更明智的方法。 –

1

IMO,其他的答案向後接近這一點。當您需要輸入時,不要使用字符。只要改變

char *input = "123456789"; 

int input = { 1, 2, 3, 4, 5 }; 

,你的代碼將工作。

P.S.這是一個解決實際問題的方法:

char digits[] = "731..."; 

int main(void) 
{ 
    int max = 0; 

    for (int len = sizeof digits - 1, i = 0; i < len - 4; i++) 
    { 
     int prod = 1; 
     for (int j = 0; j < 5; j++) 
      prod *= digits[i + j] - '0'; 
     if (max < prod) max = prod; 
    } 
    printf("%d\n", max); 

    return 0; 
} 
+0

如果輸入是1000長,你將如何把它放入一個int數組?那麼你可以看到它在這[鏈接](http://projecteuler.net/problem=8) –

+0

@TrungBún如果你想要一個具體問題的答案,問** **問題,不要添加它作爲評論。考慮到你的* new *問題,把數字放在一個字符串中比較容易一些,然後你按照你的意思減去'0',但是把它轉換成一個int數組也很簡單emacs或vi,或者使用Perl或類似的腳本。 –

+0

我很感謝你的幫助!但我更願意以我的想法去做!如果我失敗了,也許我會在其他地方創建一個新帖子或發表評論以尋求幫助。你看到了嗎?我的代碼正在工作!如果我不這樣做我的方式,那麼我怎麼知道從一個char轉換爲一個int只是通過:char - '0'?我怎麼知道我輸出的數字49是ASCII字符的十位數?這將在未來幫助我。不過謝謝你! :) –