【问题标题】:Find the largest palindrome made from the product of two 3-digit numbers in c++在 C++ 中找到由两个 3 位数字的乘积构成的最大回文数
【发布时间】:2018-11-18 18:06:04
【问题描述】:

我的程序似乎正确,但我不知道为什么它有逻辑问题

int main()
{
int r,s=0;
for(int i=10000;i<=998001;i++)
{
    while (i>0)
    {
        r=i%10;
        s=s*10+r;
        i=i/10;
    }
    cout<<s<<endl;
}

【问题讨论】:

  • 你正在改变 i 并且你的循环每次都回到 0。
  • 一点点rubber duck debugging 应该会有很长的路要走。
  • @某程序员老兄
  • 您必须为每个新的i 重置s=0,并按照kingW3 的建议引入anewvariable = i
  • 在某些场合,一张纸可以代替一只鸭子:考虑两个连续的i,仔细写出程序在做什么的结果

标签: c++ numbers logic palindrome


【解决方案1】:

您的问题和代码似乎与阿里不符。您已经告诉过您需要尽可能大的回文数,但您正在打印每一个反转的数字。而且您的代码也有故障。我将列出错误和相应的更改:

  1. 使用i 作为for 循环计数器变量以及您要反转的数字。这会导致i 在每次反转后变为0,因此for 循环永远不会结束。 对此的修复...使用另一个变量,例如num,并在循环开始时将其等同于i。这可确保i 保持不变,for 不受影响。
  2. 使用long int 而不是int。这样可以避免任何异常情况和出现垃圾号码的可能性。
  3. s(sum 变量)仅在开始时初始化。因此,每次您计算一个新的反转数字时,它都会将s 添加到其先前的值。 修复:for 循环开始时将s 初始化为0,这样您就可以为每个i 值获得一个全新的反转。
  4. 您没有检查任何回文条件。您只是在打印相反的数字。 修复:因此检查数字是否是回文,即,如果数字,即i等于反转数字,即s

我附上了下面的代码。我目前正在打印您检查的范围内的最大回文。如果您需要所有回文,只需取消注释 cout 行。

代码:

#include <iostream>
using namespace std;
int main()
{
int r, s = 0;
long int num, max = 0;
  for(long int i = 10000; i <= 998001; i++)
  {
    s = 0;
    num = i;
    while (num > 0)
    {
        r = num % 10;
        s = s * 10 + r;
        num = num / 10;
    }
    if(s == i) {
      //cout<<s<<endl;   //uncomment this line if you intend to display all palindromes
      if(i > max)
        max = i;
    }
  }
  cout<<max<<endl;
}

【讨论】:

  • 感谢您的帮助,这个问题是 Euler 项目之一,当我编写结果时,程序显示网站说这个答案是错误的 (997799)
  • @ali,你能帮我解决这个问题吗?您在这里提到的范围..它基于什么?还是任意范围?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 2013-12-31
相关资源
最近更新 更多