ГоловоломкаЧто представляет собой более эффективная реализация этой головоломки?
Для каждого входного числа п (п < 10) существует номер выходного т таким образом, что: первая цифра
- М является п
- м является п-значный номер
- каждые 2-значная последовательность внутри m должно быть другим простым числом
Выход должен m, где m - наименьшее число, удовлетворяющее указанным выше условиям. Если такого номера нет, выход должен быть равен -1;
Примеры
п = 3 -> т = 311
п = 4 -> т = 4113 (заметим, что это не 4111, как будет повторять 11)
п = 9 -> т = 971131737
Мой несколько рабочий раствор
Вот мой первый удар в этом, подход «грубой силы». Я ищу более элегантное решение, так как это очень неэффективно, так как n растет.
public long GetM(int n)
{
long start = n * (long)Math.Pow((double)10, (double)n - 1);
long end = n * (long)Math.Pow((double)10, (double)n);
for (long x = start; x < end; x++)
{
long xCopy = x;
bool allDigitsPrime = true;
List<int> allPrimeNumbers = new List<int>();
while (xCopy >= 10)
{
long lastDigitsLong = xCopy % 100;
int lastDigits = (int)lastDigitsLong;
bool lastDigitsSame = allPrimeNumbers.Count != 0 && allPrimeNumbers.Contains(lastDigits);
if (!IsPrime(lastDigits) || lastDigitsSame)
{
allDigitsPrime = false;
break;
}
xCopy /= 10;
allPrimeNumbers.Add(lastDigits);
}
if (n != 1 && allDigitsPrime)
{
return x;
}
}
return -1;
}
Первые мысли о том, как это можно было бы сделать более эффективным
Таким образом, очевидно, узким местом здесь прохождения через весь список номеров, которые могли бы выполнить это условие из п .... к (n + 1) ..... Вместо того, чтобы просто увеличивать количество каждой итерации цикла, должен быть некоторый умный способ пропуски чисел, основанный на требовании, чтобы 2-значные последовательности были первыми. Например, для n = 5 нет точки, проходящей через 50000 - 50999 (50 не является простым), 51200 - 51299 (12 не является простым), но я не был уверен, как это можно реализовать или если это было бы достаточно оптимизации, чтобы алгоритм выполнялся для n = 9.
Любые идеи относительно этого подхода или другого подхода к оптимизации?
n = 4 -> m = 971131737, кажется неправильным. Возможно, вы имели в виду n = 9 -> m = 971131737? – sara
Требование каждой двухзначной последовательности внутри m должно быть другим простым числом - ограничивает размер N до 25 (число простых чисел до 100) Поэтому - я предлагаю жестко кодировать его :) – sara
да, хорошее место @ sara :) Хм, это хорошая идея, может быть, вы можете сгенерировать m, используя список простых чисел, а не наоборот. Благодаря! :) – Metro101