我是C++的新手,试图通过[Project Euler][1]来学习。我一直到达了[Problem 4][2](令人印象深刻),但在while循环中遇到了变量作用域问题。如果你不知道,这个问题要求你找到两个三位数的最高回文积。我制作了一个while循环,应该测试一个积是否为回文(我将其放入另一个函数中-它工作得很好)。
这是我的当前代码(尽管它已经改变了很多次-我试图使这个代码最明确,这就是为什么有所有的else if):
我想说的是,如果产品是回文且高于之前的产品,则将其添加到nFinalProduct中,并将int1或int2减少以获得下一个产品。
我已经尝试多次重写main(),使用相同的逻辑,但每次输出都不会改变(在这种情况下为0)。它只更新while循环内部的值,然后在循环结束时重置它吗?我的Project Euler第三个问题的解决方案使用了相同的思想,即初始化一个变量,在while循环中更改它,并在循环外打印它,这很好用。除了可能从未发现paltest()为1之外,我无法想出问题所在,我已经进行了大量测试,没有找到问题。
感谢任何帮助。
更新:好的,谢谢大家。我将nProduct声明移动到while循环内部,现在它不会结束。这是我的新代码:
这是我的当前代码(尽管它已经改变了很多次-我试图使这个代码最明确,这就是为什么有所有的else if):
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(),使用相同的逻辑,但每次输出都不会改变(在这种情况下为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
nFinalProduct
的代码路径被执行,这意味着检查它们的条件从未得到满足。 - greatwolf