С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 12.03.2010
Сообщений: 36

Задача "Т-простые числа"

09.09.2025, 16:11. Показов 1610. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Известно, что простыми называются целые положительные числа, у которых ровно два различных положительных делителя. По аналогии назовем целое положительное число t Т-простым, если у t ровно три различных положительных делителя.

Вам дан массив, состоящий из n целых положительных чисел. Для каждого из них определите, является ли оно Т-простым или нет.

Входные данные
Первая строка содержит единственное целое число — количество чисел в массиве, n (1 ≤ n ≤ 10*5). Следующая строка содержит n целых чисел xi (1 ≤ xi ≤ 10*12), разделенных пробелами.

Выходные данные
Выведите n строк: i-тая строка должна содержать «YES» (без кавычек), если число xi является Т-простым, и «NO» (без кавычек), если не является.


При проверке задачи не влаживаюсь в ограничение по времени. Что ещё можно сделать?

Ссылка на саму задачу: codeforces.com/problemset/problem/230/B

Моё решение задачи:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from math import sqrt
a = int(input())
b = list(map(int, input().split()))
 
for i in range(a):
    c = sqrt(b[i])
    cc = int(sqrt(c)) + 1
    if c in [2, 3]:
        print('YES')
    elif b[i] == 1:
        print('NO')
    elif b[i] % 2 != 0:
        if b[i] % 3 != 0:
            if (c + 1) % 6 == 0 or (c - 1) % 6 == 0:
                for s in range(5, cc, 2):
                    if c % s == 0:
                        print('NO')
                        break
                else:
                    print('YES')
            else:
                print('NO')
        else:
            print('NO')
    else:
        print('NO')
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2025, 16:11
Ответы с готовыми решениями:

Найти все трехзначные простые числа. (Определить функцию, позволяющую распознавать простые числа.)
Найти все трехзначные простые числа. (Определить функцию, позволяющую распознавать простые...

Проверка чисел на простые и не простые
Добрый вечер) Помогите пожалуйста. Программа не сложная. Проверяет натуральные числа и определяет...

Задача: найти все простые числа в диапазоне
Вводятся два числа. Нужно найти все простые числа от A до B. Ограничение по времени - 1 секунда,...

16
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
09.09.2025, 16:54
Цитата Сообщение от MiK_on Посмотреть сообщение
Что ещё можно сделать?
оптимизировать. убрать кучу условий, если делителей больше 3х то дальше не проверять

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def is_t_prime(n):   
    divisors_count = 0
    for i in range(1, int(n**0.5) + 1):
        if n % i == 0:
            if i * i == n: # Если делитель - корень, считаем один раз
                divisors_count += 1
            else: # Иначе считаем два делителя (i и n/i)
                divisors_count += 2
        if divisors_count > 3: 
            break
    return 'YES' if divisors_count == 3 else 'NO'
 
a = int(input()) # вроде как лишняя строка но можно использовать как индексы (ваш вариант)
for b in list(map(int, input().split())):
    print(is_t_prime(b))
1
1 / 1 / 0
Регистрация: 12.03.2010
Сообщений: 36
09.09.2025, 17:06  [ТС]
Ваш вариант тоже не прошёл по времени.

Я так понимаю больше всего времени тратится на прохождение цикла. Поэтому с помощью условий попытался свести к минимуму количество чисел попадающих в цикл. Но этого мало.
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
09.09.2025, 17:51
Для начала сделайте проверку того, что число это квадрат.
Что-то типа такого:
Python
1
math.isqrt(x)**2==x

Затем проверку того, что квадратный корень из него - простое число.
2
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
10.09.2025, 21:48
Лучший ответ Сообщение было отмечено MiK_on как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
n = 1000000
primes = [False] * 2 + [True] * (n - 1)
i = 2
while i * i <= n:
    if primes[i]:
        for j in range(i * i, n + 1, i):
            primes[j] = False
    i += 1
    
input()
for x in map(int, input().split()):
    sqrt_x = int(x ** 0.5)
    print('YES' if sqrt_x * sqrt_x == x and primes[sqrt_x] else 'NO')
1
97 / 92 / 17
Регистрация: 05.08.2021
Сообщений: 455
12.09.2025, 12:00
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import math
 
l = [int(input('Число ')) for i in range(int(input('Количество ')))]
res = []
 
def find_divisors(n):
    global res
    divisors = []
    for i in range(1, int(math.sqrt(n)) + 1):
        if not n % i:
            divisors.append(i)
            if i != n // i:
                divisors.append(n // i)
    return divisors
 
for i in range(len(l)):
    res += [find_divisors(l[i])]
result = [l[i] for i in range(len(l)) if len(res[i]) == 3]
for i in l:
    if i in result:
        print('YES', i)
    else:
        print('NO', i)
1
97 / 92 / 17
Регистрация: 05.08.2021
Сообщений: 455
12.09.2025, 16:06
Результат
Изображения
 
0
97 / 92 / 17
Регистрация: 05.08.2021
Сообщений: 455
13.09.2025, 13:15
Если вот так то уже вовсе не 18 секунд, как прежде. Это было видимо из-за ручного ввода чисел. Их за две секунды руками не введешь.
Время выполнения программы: 0.004999637603759766 секунд
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import math
import time
 
start_time = time.time()
 
l = list(map(int,'6 9 8 7 25'.split(' ')))
res = []
 
def find_divisors(n):    
    divisors = []
    for i in range(1, int(math.sqrt(n)) + 1):
        if not n % i:
            divisors.append(i)
            if i != n // i:
                divisors.append(n // i)
    return divisors
 
 
for i in range(len(l)):
    res += [find_divisors(l[i])]
result = [l[i] for i in range(len(l)) if len(res[i]) == 3]
for i in l:
    if i in result:
        print('YES', i)
    else:
        print('NO', i)
        
end_time = time.time() 
execution_time = end_time - start_time 
 
print(f"Время выполнения программы: {execution_time} секунд")
Ну или поменять строки местами
Python
1
2
l = list(map(int,input().split(' ')))
start_time = time.time()
Будет 0.007018566131591797 секунд
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
13.09.2025, 15:57
Zloyalex100, серьезно? А ты попробуй для 100000 чисел посмотреть сколько времени считать будет твоя программа и числа возьми побольше.. до 10**12 в условии сказано.
0
97 / 92 / 17
Регистрация: 05.08.2021
Сообщений: 455
13.09.2025, 17:16
Не представляю как можно ввести в строку 100000 чисел

Добавлено через 28 минут
Цитата Сообщение от u235 Посмотреть сообщение
посмотреть сколько времени считать будет твоя программа
10000 чисел от 1 до 1000 считала 88.71056985855103 секунд. Полторы минуты. Долго, но по моим меркам не конец света для учебной задачи

Добавлено через 9 минут
Это при том что принты по любому работают долго. Если их убрать - получилось 0.0979917049407959 секунд
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.09.2025, 17:17
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
Не представляю как можно ввести в строку 100000 чисел
Входит и выходит, замечательно выходит.
*Сгенерировать.
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
13.09.2025, 18:32
Цитата Сообщение от Zloyalex100 Посмотреть сообщение
Долго, но по моим меркам не конец света для учебной задачи
Это непрохождение теста по ограничению времени. Незачет. О чем и говорит ТС.
Напомню: ограничение по времени на тест 2 секунды.
0
Эксперт Python
8848 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,315
13.09.2025, 19:12
Проще(быстрее) в начале найти квадраты всех простых чисел до 10**6
Затем проверить вхождение в это множество исходных чисел
У меня ~ 0.05сек для 100000 чисел до 10**12
3
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
14.09.2025, 04:25
Цитата Сообщение от Gdez Посмотреть сообщение
найти квадраты всех простых чисел до 10**6
Почему до 106, а не до 1012?
0
Вирусоборец
 Аватар для thyrex
14439 / 7481 / 1579
Регистрация: 06.09.2009
Сообщений: 27,119
14.09.2025, 10:05
Цитата Сообщение от SmallEvil Посмотреть сообщение
Почему до 106, а не до 1012?
Потому что (106)2 = 1012
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
14.09.2025, 12:47
Я думал квадраты до 106, а он имел ввиду найти простые числа до 106.
Могучий "русский", либо я не понял, либо кто то не верно его использовал.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
14.09.2025, 22:11
Чем не устраивает решение из 5го сообщения?
Данное решение принято сайтом и уложилось в требуемые ограничения по времени - 2 секунды.

Алгоритм:
1. Решетом Эратосфена определяем простые числа до 10**6 (до корня из максимально возможного введенного числа)
2. Циклом проверяем все числа. Если число является квадратом и корень из введенного числа - простое, выводим YES иначе NO
Миниатюры
Задача "Т-простые числа"  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.09.2025, 22:11
Помогаю со студенческими работами здесь

Задача Эйлера № 7 Про простые числа
Условия задачи таковы Выписав первые шесть простых чисел, получим 2, 3, 5, 7, 11 и 13. Очевидно,...

Задача на простые числа
Пусть задан список целых чисел: . В этой последовательности восемь простых чисел...

Напишите программу, которая выводит все простые числа, меньшие данного натурального числа
Напишите программу, которая выводит все простые числа, меньшие данного натурального числа. ...

Найти взаимное простые числа в диапазоне первого заданного числа
я реализую алгоритм rsa, и для того чтобы вычислить открытый ключ мне необходимо найти взаимно...

Для заданного натурального числа n определить все простые числа меньшие n
Для заданного натурального числа n определить все простые числа меньшие n. Для решения задачи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru