Нахождение самого большого палиндрома продукта двух проблем трехзначных чисел

Таким образом на 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:

  1. int i и int g мои множители. Они - те два трехзначных числа.
  2. int final число, которое сохранит самый большой палиндром.
  3. Я запускаю два для циклов, идущих во вниз для получения каждой возможности числа.
  4. Я выхожу из цикла с помощью goto, когда первый палиндром достигнут (вероятно, не должен, но, он не производит небольшую программу как это слишком много).
  5. Первый палиндром должен быть самым большим, возможным, так как я считаю в обратном порядке от вершины.

Позвольте мне теперь объяснить свою проверку:

  1. Прежде всего, так как это два трехзначных числа, умножающиеся вместе для определения размера, символ должен был бы быть должен содержать то значение, я перешел к калькулятору и умножился 999 * 999, и это закончило тем, что было 6 затем, я должен добавить тот, потому что я нашел из одного вопросы, я отправил ранее это sprintf помещает a \0 символ в конце.
  2. Хорошо, теперь, когда у меня есть символ и все, я скопировал result (который i*g в int main) и вставленный в него char b[7].
  3. Затем я просто проверил b чтобы видеть, равнялось ли это ему сам с трудным кодированием каждого слота, я должен был проверить на.
  4. Затем я возвратился соответственно, 1 для истинного, и 2 для лжи.

Это кажется совершенно логичным мне, но, это не работает по некоторой странной причине. Какие-либо подсказки?

5
задан Zero Piraeus 22 January 2015 в 18:29
поделиться

3 ответа

Это предположение неверно:

Первый палиндром должен быть самым большим из возможных, поскольку я веду отсчет сверху вниз.

Вы проверите 999*100 = 99900 перед 998*101 = 100798, так что очевидно, что вы не можете рассчитывать на это.

13
ответ дан 18 December 2019 в 08:26
поделиться

Думаю, вы решаете эту проблему задом наперед. Было бы более эффективно сгенерировать палиндромы от самого высокого до самого низкого, чем проверять их факторизацией. Ответ на первый вопрос, состоящий из двух трехзначных множителей.

например.

  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;
  }
2
ответ дан 18 December 2019 в 08:26
поделиться

Несколько слов о производительности. У вас есть возможность дублирования многих продуктов, потому что вы используете довольно простой подход с вложенными циклами. Например, вы начинаете с 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
  }
}
0
ответ дан 18 December 2019 в 08:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: