C ++程序找到最大的回文,它是两个两位数的乘积

时间:2014-09-08 14:37:34

标签: c++ palindrome

我见过this,但这不是我要找的。

问题是找到最大的回文,这是两个三位数的乘积。

由于我的程序没有工作,所以我做了一点改动,而不是找到最大的回文,这是两个三位数字的乘积我写了程序找到最大的回文,这是两个两位数的乘积

请参阅该计划:

#include <iostream>
using namespace std;
int main() {
    int i, j, n, s, m, w;
    for (i = 99; i > 9; i--) {
        for (j = 99; j > 9; j--)
            n = i * j;
        s = n;
        while (n != 0) {
            w = 0;
            m = n % 10;
            w = w * 10 + m;
            n = n / 10;
        }
        if (s == w)
            cout << s << endl;
        break;
    }
    return 0;
}

此程序的问题在于它既没有显示任何错误也没有给出任何结果。

请帮助我在程序中找到问题。

2 个答案:

答案 0 :(得分:2)

现在你错过了j循环的花括号。目前的代码正在做99! * i。

然后你必须专注于存储最大的回文值,而不是仅仅将所有这些值打印到屏幕上(这是考虑你的实现,无论如何都不是最有效的)。

答案 1 :(得分:0)

您的代码的某些修改版本:

#include <iostream>
using namespace std;
int main() {
    int max_product = 0;
    for (int i = 99; i > 9; i--) {
        for (int j = i; j > 9; j--) {
            int product = i * j;
            if (product < max_product)
                break;
            int number = product;
            int reverse = 0;
            while (number != 0) {
                reverse = reverse * 10 + number % 10;
                number /= 10;
            }
            if (product == reverse && product > max_product) {
                max_product = product;
            }
        }
    }
    cout << "Solution: " << max_product << endl;
    return 0;
}

你有各种各样的问题:

  • 还需要另外一对{}。在j的for循环之后。 j的for循环执行的唯一指令是:n = i * j;括号,其余的指令(测试它是否是回文)是不在循环中的。
  • 变量w要测试回文的数字的反向在0循环的每次执行中将其值重置为while (n != 0),从而导致错误的反向值(并且永远找不到回文)。
  • 2个两位数字的最大回文产品不必是第一个用2个for循环找到的产品,例如:假设有2个有效解i = 98,{{1} }和j = 2i = 70在这种情况下,j = 65将位于第二个i*j的第一个解决方案= 196中,当您找到第一个时,您无法阻止搜索。在使用= 4550的代码中,请执行我认为您正在等待的内容(停止搜索),只使用实际break值停止搜索。

关于修改后代码的一些注释:

  • 两个for-loop不需要来自99..9,在这种情况下,你要测试很多产品两次(例如:98 * 99,正在i进行测试i == 98以及j == 99i == 99),您可以将j == 98限制为始终小于或等于j
  • 使用i维持找到的最大回文产品。并且在内循环(max_product)中使用该信息以便在找不到更好的解决方案时提前退出。