3

我是 C++ 新手,正在尝试通过 [Project Euler][1]。我一直到 [Problem 4][2](我知道令人印象深刻)并且在我认为是 while 循环内变量的范围方面遇到了麻烦。如果你不知道,这个问题会要求你找到两个三位数整数的最高回文乘积。我做了一个while循环,它应该测试一个产品是否是回文(我把它放到另一个函数中——效果很好)。

这是我当前的代码(尽管它已经更改了很多次 - 我试图使这个代码最明确,这就是为什么所有 else ifs 的原因):

int main()
{

    int int1 = 999;
    int int2 = 999;
    int nProduct = int1 * int2;
    int nFinalProduct = 0;

    while (int1 >= 100)
    {
        if (paltest(nProduct) == 1 && nProduct > nFinalProduct && int2 > 100)
        {
            nFinalProduct = nProduct;
            --int2;
        }
        else if (paltest(nProduct) == 1 && nProduct > nFinalProduct
                 && int2 == 100)
        {
            nFinalProduct = nProduct;
            --int1;
        }
        else if (paltest(nProduct) == 0 && int2 > 100)
        {
            --int2;
        }
        else if (paltest(nProduct) == 0 && int2 == 100)
        {
            --int1;
        }
    }
    cout << nFinalProduct;
}

我基本上是想说如果产品是回文并且高于前一个,将其添加到 nFinalProduct,并减少 int1 或 int2 以获得下一个产品。

我尝试使用相同类型的逻辑多次重写 main(),但每次输出都不会从我将 nFinalProduct 初始化为(在本例中为 0)。它是否只更新while循环内的值,然后在循环结束后重置它?我对 Project Euler 的第三个问题的解决方案使用了相同的想法,即初始化一个变量,在 while 循环内更改它并在循环外打印它,效果很好。我想不出这里的问题是什么,除非它永远找不到 paltest() 为 1,我已经测试了堆并且找不到问题。

任何帮助表示赞赏。

更新:好的,谢谢大家。我将 nProduct 声明移到了 while 循环内,现在它不会结束。这是我的新代码:

int main(){

    int int1 = 999;
    int int2 = 999;
    int nFinalProduct = 0;

    while (int1 >= 100){

        int nProduct = int1 * int2;

        if (paltest(nProduct) == 1 && nProduct > nFinalProduct && int2 > 100){
            nFinalProduct = nProduct;
            --int2;
        }
        else if (paltest(nProduct) == 1 && nProduct > nFinalProduct && int2 == 100){
            nFinalProduct = nProduct;
            int2 = 999;
            --int1;
        }
        else if (paltest(nProduct) == 0 && int2 > 100){
            --int2;
        }
        else if (paltest(nProduct) == 0 && int2 == 100){
            int2 = 999;
            --int1;
        }
    }
    cout << nFinalProduct;
}

现在将无限期地运行。我的感觉是 int1 永远不会被递减(这最终会终止循环)。如果它没有被递减,则意味着 int2 永远不会递减。我在正确的轨道上吗?

[1] https://projecteuler.net [2] https://projecteuler.net/problem=4

4

4 回答 4

0

如果我正确理解了这个问题,您希望在循环的每次迭代中更新“nProduct”。所以唯一的改变是把'nProduct = int1 * int2;' 'while (int1 >= 100){' 的正下方。

于 2013-09-10T02:41:58.670 回答
0

看起来您的代码中的问题之一是nProduct永远不会在循环中更新。您将其初始化为999*999循环外部,并且在每次循环迭代中都保持这种状态。所以你一直检查相同的号码。

我会让你弄清楚如何解决这个问题。

编辑:您的回文检查功能不处理一般情况。重构它是微不足道的:

bool isPalindrome(int nProduct)
{
  string subject = to_string(nProduct);
  for(int i = 0, n = subject.length(); i < n / 2; ++i)
  {
    if(subject[i] != subject[n - i - 1]) return false;
  }

  return true;
}
于 2013-09-10T02:47:58.093 回答
0

如果你想更新 nProduct 而不是改变这个 'nProduct = int1 * int2;' 然后它会在每次迭代中改变

于 2020-04-04T07:16:05.677 回答
0

(请注意 - 我知道这是一年前提出的非常古老的问题。我只是为了完成而添加这个答案,因为其他答案都没有解决第二个代码中的问题。不期待任何紫外线)

您的第二个代码没有结束的原因是:

在计算时,它会找到int1 = 995int2 = 583值的第一个回文数,580085并将其分配给nFinalProduct变量。

第二个回文是 forint1 = 995int2 = 517values,即514415nProduct值是514415)。

检查循环内的代码if条件for 、和values 。没有任何条件导致,因此值和值都没有变化(>= ) 所以,循环永远循环。whileint1 = 995int2 = 517nProduct = 514415nFinalProduct = 580085iftrueint1int2int1995100while

代码的编写方式使得阅读变得不必要复杂。多次调用paltest()相同的值,这不是必需的。这可以简化如下:

int main(){

    int int1 = 999;
    int int2 = 999;
    int nFinalProduct = 0;

    while (int1 >= 100){

        int nProduct = int1 * int2;

        int res = paltest(nProduct);

        if ((res == 1) && (nProduct > nFinalProduct)) {
            nFinalProduct = nProduct;
        }

        --int2;

        if ((int2 < 100) || ((res == 1) && (nProduct < nFinalProduct))) {
            int2 = 999;
            --int1;
        }
    }
    cout << nFinalProduct;
}
于 2021-09-07T08:05:16.127 回答