*(А. Сражаев) Назовём особым числом такое простое натуральное число, которое на \(150\) больше ближайшего меньшего простого числа. Напишите программу, которая находит все особые числа на отрезке \([10~000~000; \, 30~000~000].\) В ответе запишите все найденные особые числа, справа от каждого из них запишите сумму всех делителей числа, полученного из найденного особого числа после удаления первой и последней цифр.
Решение:
Python
def sieve(n):
sv = [True] * (n + 1)
sv[0] = sv[1] = False
for i in range(2, int(n ** 0.5) + 1):
if sv[i]:
for j in range(i * i, n + 1, i):
sv[j] = False
return [i for i in range(1, n + 1) if sv[i]]
def divisors(n):
div = [1, n]
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
div.append(i)
div.append(n // i)
return div
primes = [x for x in sieve(30_000_000 - 150) if x > 10_000_000]
for x, y in zip(primes, primes[1:]):
if y - x == 150:
print(y, sum(divisors(int(str(y)[1:-1]))))
Java 25
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
ArrayList<Integer> sieve(int lim) {
boolean[] tmp = new boolean[lim + 1];
for (int i = 2; i < lim + 1; i++)
tmp[i] = true;
for (int i = 2; i * i <= lim; i++)
if (tmp[i])
for (int j = i * i; j < lim + 1; j += i)
tmp[j] = false;
ArrayList<Integer> ans = new ArrayList<>();
for (int i = 2; i < lim + 1; i++)
if (tmp[i]) ans.add(i);
return ans;
}
int sumDivisors(int n) {
n = n % 10000000;
n /= 10;
Set<Integer> div = new HashSet<Integer>();
div.add(1);
div.add(n);
for (int i = 2; i * i <= n; i++)
if (n % i == 0) {
div.add(i);
div.add(n / i);
}
int s = 0;
for (int x : div)
s += x;
return s;
}
void main(String args[]) {
ArrayList<Integer> st = sieve(30000000);
ArrayList<Integer> work = new ArrayList<>();
for (int n : st)
if (n >= 10000000 && n <= 30000000) work.add(n);
for (int i = 1; i < work.size(); i++)
if (work.get(i) - work.get(i-1) == 150)
System.out.println(work.get(i) + " " + sumDivisors(work.get(i)));
}
Ответ: \(12\)
Ответ:
\(13626407 \,\, 1124928\)
\(17652163 \,\, 2176902\)
\(22790507 \,\, 519126\)
\(25180471 \,\, 518048\)
\(27980987 \,\, 1383360\)
Эффективно готовьтесь к ЕГЭ по информатике с новым тренажёром, эмулирующем работу станции КЕГЭ, которая используется на реальном экзамене