Я решил эту проблему на тренинге USACO по генерации простых палиндромов между лимитами. Я процитировал расшифровку стенограммы в конце. Я решил это, сгенерировав все нечетные палиндромы ниже верхнего предела и проверив каждый из них на простое напечатанное число. Решение было передано грейдеру, но есть даже более эффективный метод, чем мой noob, генерирующий все и проверяющий вещь (потому что я действительно хочу изучить более эффективные стратегии в конкурентном программировании).
Число 151 является простым палиндромом, потому что это и простое число, и палиндром (это одно и то же число при чтении вперед и назад). Напишите программу, которая находит все простые палиндромы в диапазоне двух указанных чисел a и b (5 <= а < б <= 100 000 000); оба a и b считаются находящимися в пределах диапазона.
НАИМЕНОВАНИЕ ПРОГРАММЫ: pprime
ФОРМАТ ВВОДА
Строка 1: два целых числа, a и b
ОБРАЗЕЦ ВХОДА (файл pprime.in)
5 500
ВЫХОДНОЙ ФОРМАТ
Список палиндромных простых чисел в числовом порядке, по одному на строку.
ВЫБОР ВЫБОРА (файл pprime.out)
5
7
11
101
131
151
181
191
313
353
373
383
Я думаю, что я должен также предоставить свой алгоритм для получения вывода
Step 1. Take Input a and b
Step 2. Initialise a list of odd palindromes op
Step 3. Add 5, 7 and 11 to op
Step 4. Generate all the 3,5,7 digit odd palindromes and add to op
Step 5. Check for every element e of op
Step 5.1. If e>=a and e<=b
Step 5.1.1. If e is PRIME print e
Terminate the loop otherwise
Если бы верхняя граница была больше, этот процесс, очевидно, потерпел бы неудачу, поэтому я ищу более эффективное решение.
РЕДАКТИРОВАТЬ: я проверяю для простых чисел обычным способом, как в
Given the number I've to check for prime is n.
if (n==1) return false;
if (n==2) return true;
for (int i = 2; i <= sqrt(n); ++i)
if (n%i == 0) return false;
return true;
Задача ещё не решена.
Других решений пока нет …