C++ while 循环内更改变量
C++ changing variable inside while loop
我是C++新手,正在尝试通过[欧拉计划][1]。我一直到了[问题4][2](我知道令人印象深刻),并且在一段时间循环中我认为变量的范围方面遇到了问题。如果您不知道,则问题要求您找到两个三位整数的最高回文乘积。我做了一个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 循环中的值,然后在循环结束后重置它?我对欧拉项目的第三个问题的解决方案使用了相同的想法,即初始化一个变量,在 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
如果我正确理解了这个问题,您希望在循环的每次迭代中更新"nProduct"。因此,唯一的更改是将"nProduct = int1 * int2;"放在"while (int1>= 100){"的正下方。
看起来代码中的一个问题是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;
}
如果你想更新nProduct,那就改变这个'nProduct = int1 * int2;'然后它会在每次迭代中发生变化
(注意 - 我知道这是一年前提出的非常古老的问题。我只是为了完成而添加这个答案,因为没有其他答案在第二个代码中解决问题。不期待任何紫外线)
第二个代码没有结束的原因是:
在计算时,它会找到int1 = 995
和int2 = 583
值的第一个回文,这是580085
的,并将其分配给nFinalProduct
变量。
第二个回文用于int1 = 995
和int2 = 517
值,即514415
(nProduct
值为 514415
)。
检查代码if
循环中的条件while
以获取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++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 标准在哪里定义了可变变量可以改变
- C++11:可变的 lambda 似乎没有改变变量?
- printf() 似乎改变了一个变量
- 为什么我的变量在单独的线程中修改时没有改变?C++/boost
- 为什么 Player.x 和 Player.y 变量没有改变?
- C - 如何将各处的静态函数称为改变其私有变量
- 即使"friend class rect"在平方类中被评论,为什么它要改变矩形类的私有变量?
- 为什么调用 CUDA 内核函数时这个类成员变量没有改变
- 全局变量的顺序会改变C /OpenGL的性能
- 为什么一个函数的末尾有常量这个词,即使它确实改变了一个变量
- 如何在C++中改变超类和子类的变量
- setRoomName不会改变变量roomName
- 不能改变变量的值
- 是否有一种方法可以改变变量在内存中的存储方式(位大小)
- Std::cout改变变量的值
- 使用引用改变变量的地址