C ++在while循环内更改变量
Posted
技术标签:
【中文标题】C ++在while循环内更改变量【英文标题】:C++ changing variable inside while loop 【发布时间】:2013-09-13 15:04:08 【问题描述】:我是 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
【问题讨论】:
这可能意味着那些重新分配给nFinalProduct
的代码路径都没有被执行,这意味着检查它们的条件从未得到满足。
你真的应该接受解决这个问题的答案并开始一个新问题。
【参考方案1】:
如果我正确理解了问题,您希望在循环的每次迭代中更新“nProduct”。所以唯一的改变是把'nProduct = int1 * int2;' 'while (int1 >= 100)' 的正下方。
【讨论】:
【参考方案2】:您的代码中的问题之一是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;
【讨论】:
【参考方案3】:如果你想更新 nProduct 而不是改变这个 'nProduct = int1 * int2;' 然后它会在每次迭代中改变
【讨论】:
【参考方案4】:(请注意 - 我知道这是一年前提出的非常古老的问题。我只是为了完成而添加这个答案,因为其他答案都没有解决第二个代码中的问题。不期待任何 UV)
你的第二个代码没有结束的原因是:
在计算时,它找到int1 = 995
和int2 = 583
值的第一个回文,即580085
并将其分配给nFinalProduct
变量。
第二个回文是int1 = 995
和int2 = 517
值,即514415
(nProduct
值是514415
)。
检查while
循环内的代码if
条件,以获取int1 = 995
、int2 = 517
、nProduct = 514415
和nFinalProduct = 580085
值。 if
条件都不会导致true
,因此int1
和int2
值没有变化,int1
值是995
(>= 100
) 所以,while
循环永远循环。
代码的编写方式使阅读变得不必要复杂。多次调用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;
【讨论】:
以上是关于C ++在while循环内更改变量的主要内容,如果未能解决你的问题,请参考以下文章
C语言基础:循环结构(循环类型(while,do...while,for,嵌套循环),循环控制语句(break,continue,goto),无线循环(死循环))