Таким образом на Euler Проекта проблема 4 состояния следующее:
Палиндромическое число читает те же оба пути. Самый большой палиндром, сделанный из продукта двух 2-разрядных чисел, 9009 = 91 99.
Найдите самый большой палиндром сделанным из продукта двух 3-разрядных чисел.
Я попробовал следующее:
#include
#include
int check(int result)
{
char b[7];
sprintf(b, "%d", result);
if (b[0] == b[5] && b[1] == b[4] && b[2] == b[3])
{
return 1;
}
else
{
return 0;
}
}
int main () {
int i;
int g;
int final;
for (i = 999; i > 99; i--)
{
for (g = 999; g > 99; g--)
{
if (check(g*i) == 1)
{
final = g*i;
goto here;
}
}
}
here:
printf("%d", final);
}
Но, это не работает. Вместо правильного ответа я добираюсь 580085, который я предполагаю, палиндром, по крайней мере, но все еще правильный ответ.
Позвольте мне объяснить свою программу, начинающую с int main
:
int i
и int g
мои множители. Они - те два трехзначных числа.int final
число, которое сохранит самый большой палиндром.Позвольте мне теперь объяснить свою проверку:
sprintf
помещает a \0
символ в конце.result
(который i*g
в int main
) и вставленный в него char b[7]
.b
чтобы видеть, равнялось ли это ему сам с трудным кодированием каждого слота, я должен был проверить на.Это кажется совершенно логичным мне, но, это не работает по некоторой странной причине. Какие-либо подсказки?
Это предположение неверно:
Первый палиндром должен быть самым большим из возможных, поскольку я веду отсчет сверху вниз.
Вы проверите 999*100 = 99900
перед 998*101 = 100798
, так что очевидно, что вы не можете рассчитывать на это.
Думаю, вы решаете эту проблему задом наперед. Было бы более эффективно сгенерировать палиндромы от самого высокого до самого низкого, чем проверять их факторизацией. Ответ на первый вопрос, состоящий из двух трехзначных множителей.
например.
bool found = false;
for (int i = 998; i >= 100; i--)
{
char j[7];
sprintf(j,"%d",i);
j[3]= j[2];
j[4]= j[1];
j[5]= j[0];
int x =atoi(j);
int limit = sqrt((float) x);
for (int z = 999; z >= limit; z--)
{
if (x%z==0){
printf("%d",x);
found = true;
break;
}
}
if (found) break;
}
Несколько слов о производительности. У вас есть возможность дублирования многих продуктов, потому что вы используете довольно простой подход с вложенными циклами. Например, вы начинаете с 999*999, затем 999*998 и т.д. Когда внутренний цикл завершится, вы уменьшите внешний цикл и начнете снова с 998*999, что то же самое, что и 999*998.
На самом деле, вы хотите начать внутренний цикл с того же значения, что и текущее значение внешнего цикла. Это устранит дублирование операций. Что-то вроде этого...
for (i = 999; i > 99; i--)
{
for (g = i; g > 99; g--)
{
...
Однако, как заметил Эмилио, ваше предположение, что первый найденный палиндром будет ответом, неверно. Очевидно, что сначала нужно вычислить самые большие числа. Поэтому вам следует попробовать их в таком порядке: 999*999, 999*998, 998*998, 999*997, 998*997 и т.д....
Не тестировал, но думаю, вам нужно что-то вроде этого (псевдокод):
x = 999;
n = 0;
while (++n <= x)
{
j = x;
k = j - n;
while (j >= k)
{
y = j-- * k;
if (check(y))
stop looking
}
}