我正在尝试使用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”条件一样。我尝试用较小的数字尝试相同的代码,但仍然无法正常工作。感谢所有帮助。
答案 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