【问题标题】:C++ program to find the largest palindrome which is product of two two digit numbers [closed]C ++程序找到最大的回文数,它是两个两位数的乘积[关闭]
【发布时间】:2014-09-08 14:37:34
【问题描述】:

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

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

由于我的程序不工作,所以我做了一点改变,而不是找到最大的回文数,即两个三位数的乘积,我编写了程序来查找最大的回文数,即两个两位数的乘积.

请看节目:

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

这个程序的问题是它既不显示任何错误也不给出任何结果。

请帮我找出程序中的问题。

【问题讨论】:

  • 1) 对变量使用有意义的名称。一个字母的变量充其量是令人困惑的。 2) 选择一种缩进样式。没有两三个完全混在一起。如果你这样做,你会看到你的循环之一可能在它的块周围缺少花括号。 3) 不要只是把你的代码转储给别人发现错误,试着缩小范围并调试它。

标签: c++ palindrome


【解决方案1】:

现在您缺少 j 循环的花括号。当前代码是做99! * 我。

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

【讨论】:

    【解决方案2】:

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

    #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; 带大括号的其余指令(测试它是否是回文)不在循环中。
    • 在每次执行while (n != 0) 循环时,用于测试回文数的变量w 将其值重置为0,从而导致错误的反向值(并且永远找不到回文)。
    • 2 个两位数的最大回文乘积不一定是通过这 2 个 for 循环找到的第一个,例如:假设有 2 个有效解 i = 98j = 2i = 70j = 65 在这种情况下i*j 将在第二个= 4550 中的第一个解决方案= 196 中,当您找到第一个解决方案时,您无法停止搜索。在您使用 break 的代码中,不要执行我认为您正在等待的操作(停止搜索),仅使用实际的 i 值停止搜索。

    关于修改代码的一些说明:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多