最大的回文由两个3位数字与C的乘积组成

时间:2015-10-17 08:11:06

标签: c algorithm

该代码试图找到由两个2位数字的乘积制成的最大回文。答案是91 * 99 = 9009,但我一直得到990,这甚至不是回文。我非常感谢你的帮助!

#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;
}

3 个答案:

答案 0 :(得分: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;


}

答案 1 :(得分: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);
}

这很容易理解。

答案 2 :(得分:0)

您似乎没有在循环开始时重新初始化变量。它们保留了之前迭代的值。例如,jdivider。放

  j = 10;

开始之前&#34; j&#34;循环,即:

   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++) { 
     ...
  }
}