C ++在循环中改变变量

问题描述 投票:3回答:2

我是C ++的新手,并试图通过[Project Euler] [1]。我一路走到[问题4] [2](令人印象深刻,我知道)并且遇到了我认为我的变量在while循环中的范围的问题。如果您不知道,问题会要求您找到两个三位整数的最高回文产品。我做了一个while循环,它应该测试一个产品是否是一个回文(我把它放入另一个函数 - 它工作正常)。

这是我当前的代码(虽然它已经改变了很多次 - 我试图让这个代码最明确,这就是为什么所有其他的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

c++ loops scope while-loop palindrome
2个回答
0
投票

如果我正确理解了这个问题,你想在循环的每次迭代中更新'nProduct'。所以唯一的变化就是放'nProduct = int1 * int2;'在'while(int1> = 100){'的正下方。


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;
}
© www.soinside.com 2019 - 2024. All rights reserved.