С++ изменение переменной внутри цикла while

Я новичок в C++ и пытаюсь пройти [Project Euler][1]. Я прошел весь путь до [Проблемы 4][2] (впечатляет, я знаю), и у меня проблемы с тем, что я считаю областью действия моих переменных внутри цикла while. Если вы не знаете, задача попросит вас найти наибольшее палиндромное произведение двух трехзначных целых чисел. Я сделал цикл 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, а затем сбрасывает его после завершения цикла? Мое решение для третьей проблемы 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


person Daniel Forsyth    schedule 10.09.2013    source источник
comment
Вероятно, это означает, что ни один из тех путей кода, которые переназначают nFinalProduct, не был выполнен, что означает, что условия, проверяющие их, никогда не выполнялись.   -  person greatwolf    schedule 10.09.2013
comment
Вы действительно должны были принять ответ, который устранил эту проблему, и начать новый вопрос.   -  person kfsone    schedule 10.09.2013


Ответы (3)


Если я правильно понимаю проблему, вы хотите обновлять «nProduct» на каждой итерации цикла. Таким образом, единственное изменение состоит в том, чтобы поставить «nProduct = int1 * int2;» прямо под 'в то время как (int1 >= 100){'.

person MichaelQuigley    schedule 10.09.2013

Похоже, одна из проблем в вашем коде заключается в том, что 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;
}
person greatwolf    schedule 10.09.2013

если вы хотите обновить nProduct, измените это 'nProduct = int1 * int2;' и тогда он будет меняться в каждой итерации

person Devendra singh    schedule 04.04.2020