2014-01-09 61 views
0

我試着用C語言解決歐拉項目的問題4,但始終得到錯誤的答案。用C語言解決項目歐拉#4

// Project Euler - Problem 5 
// 09/01/2014 
#include <stdio.h> 

int a,b,c,digits[14],e,y,z,biggestNum; 

void isPalindrome (int x) 
{ 
    a = -1; 
    c = 0; 
    b = x; 
    while (b != 0) 
    { 
     digits[c] = (b % 10); 
     b=b/10; 
     c++; 
    } 
    while (c>=a) 
    { 
     if(digits[++a]!=digits[--c]) 
     { 
      break; 
     } 
     if(a==c) { biggestNum=x; } 
     else if(a==c-1) { biggestNum=x; } 
    } 
} 

int main (void) 
{ 
    for(y=10; y<1000; y++) 
    { 
     for(z=10; z<1000; z++) 
     { 
      isPalindrome(y*z); 
     } 
    } 
    printf ("%d",biggestNum); 
    return 0; 
} 

有人能告訴我我的代碼有什麼問題嗎?也許在檢查數字是迴文功能? 感謝 The Problem

+0

如果您在自己的帖子中提供了問題鏈接,將會非常有幫助。 –

+0

那麼,如果您的isPalindrome函數是源代碼的90%,而其餘的10%是主線,則isPalindrome函數中存在很大的問題。你可能想看看那裏並做一些調試。它能正確檢測迴文?它能否正確拒絕非迴文數字? – misha

+0

你的代碼打印了什麼? –

回答

1

您的代碼沒有找到最大的迴文,發現最後一個迴文如果通過數字運行

10* 10, 10 * 11, 10 * 12, .... 10 * 999 
... 
999 * 10, 999 * 11, ....  999 * 999 

如果最大回文恰好是(說)750 * 750,但999 * 11是一個迴文,999 * 11將覆蓋正確的答案。

你需要測試每次你的答案比你以前的最大答案更大。

+0

@BLUEPIXY謝謝 - 修正。 – JeremyP

+0

非常感謝。這是我修復代碼後輸出數字906609是正確答案的問題。 – user3178186

1
  1. 可以提高以下的福爾循環:
 
    for(y = 999; y >= 100 ; --y) 
    { 
     for(z = y; z >= 100; --z) 
     { 
      if (isPalindrome(y*z)) { 
       return y*z; // TODO: use temp var 
      } 
     } 
    } 
  1. 它會更容易使用N/2步到數字轉換爲字符串,並檢查(是n的位數)
 
    for (i = 0; i < n/2; i++) 
    { 
     if (str[i] != str(n-i)) { 
      return false; 
     } 
    } 
    return true 
+0

爲什麼不從999開始下降到100,畢竟我們想要最大的迴文,你將以這種方式得到的第一個迴文是答案。 –

+0

你是對的,我的回答是錯誤的,因爲'999 * 999'沒有被計算,我會更新。 –

+0

現在可以正確優化了,謝謝! –

0

變化

while (c>=a) 
    { 
     if(digits[++a]!=digits[--c]) 
     { 
      break; 
     } 
     if(a==c) { biggestNum=x; } 
     else if(a==c-1) { biggestNum=x; } 
    } 

while (c > a){ 
     if(digits[++a]!=digits[--c]) 
      return ; 
    } 
    if(x>biggestNum)//bigger than old value 
     biggestNum=x;