2015-10-17 47 views
-1

該代碼試圖找到由兩個2位數字產品製成的最大回文。答案是91 * 99 = 9009,但我一直得到990,這甚至不是迴文。我非常感謝幫助!由兩個3位數字與C產品構成的最大回文數C

#include <stdio.h> 

int main() 

{ 
    int i = 10; 
    int j = 10; 
    int a = 0; 
    int b = 0; 
    int array[100] = {0}; 
    int divider = 10; 
    int num; 
    int great; 
    int product; 
    int n; 
    int flag; 

    /*Loop through first 2 digit number and second 2 digit number*/ 

    while (i<100) 
    { 
     while (j < 100) 
     { 
      product = i*j; 
      array [a] = product % 10; 
      n = product/divider; 

      while (n != 0) 
      { 
       a++; 
       num = n%10; 
       divider *=10; 
       array[a]=num; 
       n = product/divider; 
      } 

      flag = 0; 

      while (b<a) 
      { 
       if (array[b] != array[a]) 
       { 
        flag = 1; 
       } 
       b++; 
       a--; 
      } 

      if (flag == 0) 
      { 
       great = product; 
      } 

      j++; 
      a = 0; 
      b = 0; 
     }  
     i++; 
    } 

    printf("The largest palindrome is %d \n", great); 

    return 0; 
} 
+1

如果你得到的東西不是迴文,你是否試圖專注於檢查數字是迴文的代碼部分?嘗試縮小你的問題... – CygnusX1

+1

只是對代碼的評論...而不是使用一個單片代碼塊,將它分成函數...像'int is_palindrome(int in)'。這將更容易理解和調試 – knightrider

+1

只需對算法發表評論...您正在嘗試查找最大的迴文編號...因此,最好從最高點開始檢查產品,並在找到第一個時候停止迴文編號。 – knightrider

回答

0

看起來你並沒有在循環開始時重新初始化變量。他們保留以前迭代的值。例如,jdivider。把

j = 10; 

開始前, 「J」 循環,即:

j = 10; 
    while (j < 100) ... 

同爲除法:

 ... 
    j = 10; 
    while (j < 100) { 
      divider = 10; 
      ... 

如果您正在使用for循環,你自然會避免這個問題:

for(i=10; i<100; i++) { 
    for(j=10; j<100; j++) { 
    ... 
    } 
} 
+0

爲什麼** j **每次都必須初始化爲0?它是兩種產品的號碼之一。 – wrangler

+0

他可能想要檢查'i'和'j'的所有組合,不僅對所有'j'都有'0',對'100'還有剩下的'i'。 – Marian

+0

i和j都在循環的底部遞增。 – wrangler

1

這裏是你可以嘗試的代碼片段。

#include <stdio.h> 

void main() 
{ 
int a = 1;  // first integer 
int b = 1;  // second integer 
int currentNumber;  
int currentPalin;  if a palindrome is found, its stored here 

while (a<100){  //loop through the first number 

     while (b<100){  // loop through the second number 
      currentNumber = a*b; 
      if (currentNumber == reverse(currentNumber)){  //check for palindrome 
       currentPalin = currentNumber; 

      } 
      b = b+1;  //increment the second number 

     } 
     b = a; // you could have set b=1 but it would not be an efficient algorithm because 
      //some of the multiplication would occur twice. eg- (54*60) and (60*54) 
     a = a +1;  //increment the first number 
    } 
printf ("Largest palindrom is %d \n", currentPalin); 

getchar(); 

} 
// method for finding out reverse 
int reverse(int n){ 
    int reverse = 0; 



while (n != 0) 
{ 
    reverse = reverse * 10; 
    reverse = reverse + n%10; 

// when you divide a number by 10, the 
//remainder gives you the last digit. so you are reconstructing the 
//digit from the last 

    n = n/10; 
} 

return reverse; 


} 

更新: -作爲由M Oehm的建議,我已經修改了代碼,使其更通用。

#include <stdio.h> 

void main() 
{ 
int a = 1; 
int b = 1; 
int currentNumber; 
int currentPalin=0; 

while (a<100){ 

     while (b<100){ 
      currentNumber = a*b; 
      if (currentNumber == reverse(currentNumber)){ 
       if (currentNumber>currentPalin){ 
         currentPalin = currentNumber;      
        } 

      } 
      b = b+1; 

     } 
     b = 1; 
     a = a +1; 
    } 
if (currentPalin==0){ 
    printf("No Palindrome exits in this range"); 
} 
else { 
    printf ("Largest palindrome is %d \n", currentPalin); 
} 

getchar(); 

} 

int reverse(int n){ 
    int reverse = 0; 



while (n != 0) 
{ 
    reverse = reverse * 10; 
    reverse = reverse + n%10; 
    n = n/10; 
} 

return reverse; 


} 
+2

你的算法在方塊上錯過了。 (碰巧,在給定範圍內沒有迴文正方形,但仍然應該檢查。)你還假定最後一個迴文是最高的,這在這裏是正確的,因爲其中一個因素是99,但是如果我們忽略了99的產品,有'97 * 55 == 5335',它比'96 * 88 == 8448'小,儘管在稍後的循環中計算。您必須檢查產品是否大於當前最佳匹配。 –

+0

此外,請將'currentPalin'初始化爲適當的默認值,以便您可以判斷是否有任何迴文。 –

+0

謝謝! @Meehm,我根據你的建議更新了答案。 – phositronax

1

解決問題的另一種方法。

#include<stdio.h> 

int reverse(int num) 
{ 
    int result = 0; 
    while(num > 0) 
    { 
     result = result * 10 + (num%10); 
     num/=10; 
    } 
    return result; 
} 

int main() 
{ 
    int last_best = 1; 
    int best_i=1; 
    int best_j = 1; 
    const int max_value = 99; 

    for(int i = max_value ; i > 0 ; --i) 
    { 
     for(int j = i ; j > 0 ; --j){ 
      int a = i * j; 
      if(last_best > a) 
       break; 
      else if (a == reverse(a)) 
      { 
       last_best = a; 
       best_i = i; 
       best_j = j; 
      } 
     } 
    } 
    printf("%d and %d = %d\n", best_i,best_j,last_best); 
} 

而且它很簡單。

+1

您的解決方案與phositronax具有相同的錯誤:您認爲迴文最高出現在嵌套循環中,但在一般情況下不一定如此。 (這是因爲其中一個因素是99.) –

+0

糾正了......感謝指出 – gjha