最大的回文产品(欧拉计画)-C ++

时间:2019-10-27 04:40:43

标签: c++

我正在尝试使用C ++解决Euler项目的problem 4

回文数在两个方向上都相同。由两个两位数的乘积构成的最大回文数为9009 = 91×99。 查找由两个3位数字的乘积组成的最大回文。

这是我的C ++代码:

#include <iostream>
using namespace std;

bool isPalindrome(int num1){
    int num2, digit, rev = 0;
    num1 = 0;

     num2 = num1;
     do
     {
        digit = num1 % 10;
        rev = (rev * 10) + digit;
        num1 = num1 / 10;
     } while (num1 != 0);

     if (num2 == rev){
         return true;
     }
     else{
         return false;
     }
};

int main(){

    int product = 1321;
    int num1 = 999;
    int num2 = 999;
    while(isPalindrome(product)!=1){
        product= num1*num2;
        if(isPalindrome(product)==1){
            cout<< product;
            break;
        }
    num1--;
    };
};

我将product = 1321作为一个任意值,以便替换最初存储的垃圾值。但是,当我运行此代码时,控制台中没有任何输出。完全空白,就好像没有在执行“ if”条件一样。我尝试用较小的数字尝试相同的代码,但仍然无法正常工作。感谢所有帮助。

1 个答案:

答案 0 :(得分:2)

您似乎只在查看由减少的num1恒定设置为999的数字 num2组成的数字。

我怀疑您没有看到输出,因为没有数字999n, 0 < n < 1000是回文的。

可能是错误的,但是无论如何,您仍然需要检查num2 other 值。

类似这样的东西(伪代码)将是一个好的开始:

bigPalin = -1
for n1 in 100..999: # Three-digits means 100 thru 999.
    for n2 in 100..999:
        prod = n1 * n2
        if prod > bigPalin:
            if isPalindrome(prod):
                bigPalin = prod
if bigPamin != -1:
    print bigPalin

顺便说一句,首先要进行比当前最大回文数大的数字检查,因为单次乘法几乎肯定比回文检查便宜。


为完成操作(我建议您 不要使用它,除非您自己尝试一次),这是我想出的C代码:

#include <stdio.h>

static int isPalin(int num) {
    // Use temporary to create reversed value.

    int test = num, rev = 0;
    while (test > 0) {
        rev = rev * 10 + (test % 10);
        test /= 10;
    }

    // Return check that original and reversed are same.

    return rev == num;
}

int main() {
    // Largest palindrome and factors that made it.

    int bigPalin = -1, big1 = 0, big2 = 0;

    // Loop through values for n1.

    for (int n1 = 100; n1 < 1000; ++n1) {
        // Addition probably faster than multiplication, so use that,
        // adding n1 each time rather than working out n1 * n2.
        // Also we baseline at 99*n1 so first is 100*n1.

        int prod = 99 * n1;
        for (int n2 = 100; n2 < 1000; ++n2) {
            prod += n1;

            // Don't check for palindrome if product is not greater,
            // this works because C shortcuts logical AND.

            if (prod > bigPalin && isPalin(prod)) {
                // A bigger palindrome? Store details.

                big1 = n1;
                big2 = n2;
                bigPalin = prod;
            }
        }
    }

    // Print out final details.

    printf("%d x %d = %d\n", big1, big2, bigPalin);
    return 0;
}

在Ubuntu上定时运行它表明它非常快,仅需不到四十分之一秒的时间即可:

pax@paxBox1> time ./myTestProg
913 x 993 = 906609

real    0m0.038s
user    0m0.016s
sys     0m0.000s