C++更改while循环内的变量

e0bqpujr  于 2023-02-06  发布在  其他
关注(0)|答案(4)|浏览(169)

我是C++的新手,我正在尝试完成[Project Euler][1]。我一直到了[问题4][2]。(我知道这很令人印象深刻),而且我认为在while循环中我的变量的作用域有问题。如果你不知道,这个问题要求你找出两个三位整数的最大回文积。2我做了一个while循环测试一个产品是否是回文(我把它放到另一个函数中--效果很好)。
下面是我当前的代码(尽管它已经修改过很多次了--我试图让这段代码最明确,这就是为什么其他所有的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()使用相同类型的逻辑执行了几次,但每次输出都没有从我初始化nFinalProduct的值更改为(在本例中为0)。它是否只更新while循环中的值,然后在循环结束时重置它?我对Project Euler第三个问题的解决方案使用了相同的初始化变量的思想,在while循环中修改它,然后在循环外打印它,这样做很好,我想不出这里的问题是什么,除非它从来没有发现paltest()为1,我已经测试了堆,没有发现问题。
任何帮助都很感激。
UPDATE:好的,谢谢大家。我把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](https://projecteuler.net) [2] https://projecteuler.net/problem=4

5hcedyr0

5hcedyr01#

如果我对问题的理解是正确的话,您希望在循环的每次迭代中更新'nProduct',因此唯一的更改就是将'nProduct = int 1 * int 2;“while(int 1〉= 100){”的右下方。

idfiyjo8

idfiyjo82#

看起来你的代码中的一个问题是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;
}
yruzcnhs

yruzcnhs3#

如果要更新n产品,则更改此“n产品= int 1 * int 2;'然后它将在每次迭代中更改

vql8enpb

vql8enpb4#

  • (注意-我知道这是一年前问的老问题。我只是为了完整起见添加此答案,因为其他答案都没有解决第二个代码中的问题。不期望任何UV)*

第二个代码没有结束的原因是:
计算时,找到int1 = 995int2 = 583值的第一个回文,即580085及其get赋值给nFinalProduct变量。
第二个回文对应于int1 = 995int2 = 517的值,即514415nProduct的值为514415)。
检查while循环中的代码if条件,以获取int1 = 995int2 = 517nProduct = 514415nFinalProduct = 580085值。没有任何if条件会导致true、因此,int1int2值没有改变,且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;
}

相关问题