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