我是 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