Выдаёт ошибку на некоторых тестах,что делать?

andr2004

Новичок
Пользователь
Апр 7, 2020
24
4
3
Здравствуйте,по некоторым тестам сайт выдаёт ошибку(какую не знаю).Такую задачу я уже решал,но там было ограничение по n меньше.До этого решение не проходило по времени,а теперь выдаёт ошибку.Можно ли как-то узнать какую и где?
Дано натуральное число n
char14.png
10^8. Подсчитайте количество таких пар чисел (a
char3B.png
b) , что:
  1. a и b — делители n.
  2. a
    char3C.png
    b.
  3. a и b — взаимно простые.
  4. ab
    char14.png
    n.
Входные данные
Вводится натуральное число.
Выходные данные
Выведите количество таких пар.

Python:
n = int(input())
s = 0
c = [0] * (n + 2)
for i in range(1, n + 1):
    if n % i == 0:
        c[i] = i
def gcd(a, b):
    while b:
        a, b = b, a % b
    return a
for a in range(1, int(n ** 0.5) + 1):
    for b in range(a + 1, n // a + 1):
        if c[a] != 0 and c[b] != 0:
            if gcd(c[a], c[b]) == 1:
                s += 1
print(s)
Python3.7
OC:Windows
 
Последнее редактирование:

shishkinav

Пользователь
Пользователь
Апр 18, 2020
11
9
3
Здравствуйте,по некоторым тестам сайт выдаёт ошибку(какую не знаю).Такую задачу я уже решал,но там было ограничение по n меньше.До этого решение не проходило по времени,а теперь выдаёт ошибку.Можно ли как-то узнать какую и где?
Python:
n = int(input())
s = 0
c = [0] * (n + 2)
for i in range(1, n + 1):
    if n % i == 0:
        c[i] = i
def gcd(a, b):
    while b:
        a, b = b, a % b
    return a
for a in range(1, int(n ** 0.5) + 1):
    for b in range(a + 1, n // a + 1):
        if c[a] != 0 and c[b] != 0:
            if gcd(c[a], c[b]) == 1:
                s += 1
print(s)
Python3.7
OC:Windows

@andr2004 Представленный Вами код не бросает в интерпретаторе ошибок при вводе целочисленных значений 10, 135 и т.п.

Учитывая, что Вы пишите о каких-то тестах, предполагаю, что используется какой-то сервис с прогоном по ряду тестовых случаев, соответственно, чтобы Вам могли помочь разобраться с вопросом, Вам необходимо:
  • указать сервис где проверяется код
  • указать полностью задание, под которое пишется код, потому что Вы можете просто не достичь нужно результата и он не пройдёт тесты в сервисе на проверку
  • если вы хоть в каком-то интерфейсе наблюдаете лог ошибок (tracelog) / или коды ошибок сервиса - также указать их спойлером в ответе
На будущее, чтобы не получить бан за такой формат вопросов, ознакомьтесь, пожалуйста, с инструкцией Как правильно составить вопрос и не получить бан? и измените тему вместе с внесёнными уточнениями.
 
  • Мне нравится
Реакции: Student

shishkinav

Пользователь
Пользователь
Апр 18, 2020
11
9
3
Python:
# в этой переменной будем считать пары
COUNT = 0

def check_nod(a, b):
    """
    определим являются ли a и b взаимно простыми
    """
    x = (b, a)[a > b]
    for _ in range(2, x):
        if a % _ == 0 and b % _ == 0:
            return False
    return True


def check_rule(a, b, n):
    """
    проверка исполнения условий задачи
    если ОК, то считаем пару (a, b) подходящей
    """
    if a < b and a * b <= n and check_nod(a, b):
        global COUNT
        COUNT += 1


n = int(input())
# собираем в список все возможные делители для n
c = [i for i in range(1, n + 1) if n % i == 0]
for index_a in range(len(c)):
    for index_b in range(len(c)):
        check_rule(c[index_a], c[index_b], n)

print(COUNT)
 
Последнее редактирование:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Python:
n = int(input())
s = 0
d = 0
c = [0] * n
for i in range(1, n + 1):
    if n % i == 0:
        c[d] = i
        d += 1
def gcd(a, b):
    while b:
        a, b = b, a % b
    return a
for a in range(0, d - 1):
    for b in range(a + 1, d):
        if gcd(c[a], c[b]) == 1:
            s += 1
print(s)
Я немного доработал код,но он всё равно не работает((?
Вот так вроде немного быстрее:
Python:
def gcd(a, b):
    while b:
        a, b = b, a % b
    return a

n = int(input())
s = 0
c = [1]
for i in range(2, n + 1):
    if n % i == 0:
        for j in c:
            if gcd(i, j) == 1:
                s += 1
                if i > max(c):
                    c.append(i)
print(s)
Вот так скорость такая же , но код короче:
Python:
def gcd(a, b):
        while b:
            a, b = b, a % b
        return a

n = int(input())
s = 0
c = [1]
for i in range(2, n + 1):       
    if n % i == 0:
        c.append(i)
        s += len([j for j in c if gcd(i, j) == 1])
print(s)
 
Последнее редактирование:
  • Мне нравится
Реакции: shishkinav

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Когда создаете темы формулируйте вопрос в названии темы более конкретно, например: Решение задачи "название задачи" не проходит по тестам. А в тексте опишите полное условие задачи и ваш код в форматированном виде. У вас сейчас есть только код, а вопрос и название темы не понятны.
 
  • Мне нравится
Реакции: Student

andr2004

Новичок
Пользователь
Апр 7, 2020
24
4
3
Когда создаете темы формулируйте вопрос в названии темы более конкретно, например: Решение задачи "название задачи" не проходит по тестам. А в тексте опишите полное условие задачи и ваш код в форматированном виде. У вас сейчас есть только код, а вопрос и название темы не понятны.
Извините,совсем забыл.
Дано натуральное число n
char14.png
10^8. Подсчитайте количество таких пар чисел (a
char3B.png
b) , что:
  1. a и b — делители n.
  2. a
    char3C.png
    b.
  3. a и b — взаимно простые.
  4. ab
    char14.png
    n.
Входные данные
Вводится натуральное число.
Выходные данные
Выведите количество таких пар.
 
Последнее редактирование:
  • Мне нравится
Реакции: Student

andr2004

Новичок
Пользователь
Апр 7, 2020
24
4
3
@andr2004 Представленный Вами код не бросает в интерпретаторе ошибок при вводе целочисленных значений 10, 135 и т.п.

Учитывая, что Вы пишите о каких-то тестах, предполагаю, что используется какой-то сервис с прогоном по ряду тестовых случаев, соответственно, чтобы Вам могли помочь разобраться с вопросом, Вам необходимо:
  • указать сервис где проверяется код
  • указать полностью задание, под которое пишется код, потому что Вы можете просто не достичь нужно результата и он не пройдёт тесты в сервисе на проверку
  • если вы хоть в каком-то интерфейсе наблюдаете лог ошибок (tracelog) / или коды ошибок сервиса - также указать их спойлером в ответе
На будущее, чтобы не получить бан за такой формат вопросов, ознакомьтесь, пожалуйста, с инструкцией Как правильно составить вопрос и не получить бан? и измените тему вместе с внесёнными уточнениями.
Проверка проходит на сайте https://informatics.mccme.ru/mod/statements/view3.php?chapterid=4192#1 на тестах 18-32 выдаёт, что произошла ошибка во время выполнения программы
 

shishkinav

Пользователь
Пользователь
Апр 18, 2020
11
9
3
Извините,совсем забыл.
Дано натуральное число n
char14.png
10^8. Подсчитайте количество таких пар чисел (a
char3B.png
b) , что:
  1. a и b — делители n.
  2. a
    char3C.png
    b.
  3. a и b — взаимно простые.
  4. ab
    char14.png
    n.
Входные данные
Вводится натуральное число.
Выходные данные
Выведите количество таких пар.

мне кажется Ваш код, как минимум, не проверяет первое условие
например, если я введу 10, то получаю по вашему коду, что есть 4 пары соответствующие условиям, но, по факту есть только одна пара (2, 5), которая:
  • и 2 и 5 являются делителями 10
  • 2 меньше 5
  • 2 и 5 имеют НОД равный 1
  • 2 * 5 меньше либо равно 10
буду признателен, если подскажете мне ещё хотя бы одну пару, возможно конечно, что второй парой будет являться (1, 10) если тестовые проверки ресурса не имеют ограничения на то, что одно из чисел может быть равно 1
 

andr2004

Новичок
Пользователь
Апр 7, 2020
24
4
3
мне кажется Ваш код, как минимум, не проверяет первое условие
например, если я введу 10, то получаю по вашему коду, что есть 4 пары соответствующие условиям, но, по факту есть только одна пара (2, 5), которая:
  • и 2 и 5 являются делителями 10
  • 2 меньше 5
  • 2 и 5 имеют НОД равный 1
  • 2 * 5 меньше либо равно 10
буду признателен, если подскажете мне ещё хотя бы одну пару, возможно конечно, что второй парой будет являться (1, 10) если тестовые проверки ресурса не имеют ограничения на то, что одно из чисел может быть равно 1
На самом сайте есть пример входных данных и это число 10.Ответ:4.Все пары: 2 и 5; 1 и 10; 1 и 2; 1 и 5.
 

andr2004

Новичок
Пользователь
Апр 7, 2020
24
4
3
Python:
n = int(input())
s = 0
d = 0
c = [0] * n
for i in range(1, n + 1):
    if n % i == 0:
        c[d] = i
        d += 1
def gcd(a, b):
    while b:
        a, b = b, a % b
    return a
for a in range(0, d - 1):
    for b in range(a + 1, d):
        if gcd(c[a], c[b]) == 1:
            s += 1
print(s)
Я немного доработал код,но он всё равно не работает((?
 

andr2004

Новичок
Пользователь
Апр 7, 2020
24
4
3
Python:
# в этой переменной будем считать пары
COUNT = 0

def check_nod(a, b):
    """
    определим являются ли a и b взаимно простыми
    """
    x = (b, a)[a > b]
    for _ in range(2, x):
        if a % _ == 0 and b % _ == 0:
            return False
    return True


def check_rule(a, b, n):
    """
    проверка исполнения условий задачи
    если ОК, то считаем пару (a, b) подходящей
    """
    if a < b and a * b <= n and check_nod(a, b):
        global COUNT
        COUNT += 1


n = int(input())
# собираем в список все возможные делители для n
c = [i for i in range(1, n + 1) if n % i == 0]
for index_a in range(len(c)):
    for index_b in range(len(c)):
        check_rule(c[index_a], c[index_b], n)

print(COUNT)
Спасибо,буду разбираться что к чему.
 

shishkinav

Пользователь
Пользователь
Апр 18, 2020
11
9
3
Спасибо,буду разбираться что к чему.
обратите только внимание, я нашёл ошибку и поправил в строке
if a % _ == 0 and b % _ == 0
чтобы не было ошибки, просто копируйте весь код заново из того сообщения
 

andr2004

Новичок
Пользователь
Апр 7, 2020
24
4
3
Python:
# в этой переменной будем считать пары
COUNT = 0

def check_nod(a, b):
    """
    определим являются ли a и b взаимно простыми
    """
    x = (b, a)[a > b]
    for _ in range(2, x):
        if a % _ == 0 and b % _ == 0:
            return False
    return True


def check_rule(a, b, n):
    """
    проверка исполнения условий задачи
    если ОК, то считаем пару (a, b) подходящей
    """
    if a < b and a * b <= n and check_nod(a, b):
        global COUNT
        COUNT += 1


n = int(input())
# собираем в список все возможные делители для n
c = [i for i in range(1, n + 1) if n % i == 0]
for index_a in range(len(c)):
    for index_b in range(len(c)):
        check_rule(c[index_a], c[index_b], n)

print(COUNT)
Сейчас быстро попробовал проверить.К сожалению программа проходит ещё меньше тестов(с 18 по 32 тесты - превышено максимальное время работы,а в оставшихся 11 не правильных - неправильный ответ)
 

andr2004

Новичок
Пользователь
Апр 7, 2020
24
4
3
Вот так вроде немного быстрее:
Python:
def gcd(a, b):
    while b:
        a, b = b, a % b
    return a

n = int(input())
s = 0
c = [1]
for i in range(2, n + 1):
    if n % i == 0:
        for j in c:
            if gcd(i, j) == 1:
                s += 1
                if i > max(c):
                    c.append(i)
print(s)
Вот так скорость такая же , но код короче:
Python:
def gcd(a, b):
        while b:
            a, b = b, a % b
        return a

n = int(input())
s = 0
c = [1]
for i in range(2, n + 1):      
    if n % i == 0:
        c.append(i)
        s += len([j for j in c if gcd(i, j) == 1])
print(s)
Всё равно тесты не проходит(превышено максимальное время работы)
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Всё равно тесты не проходит(превышено максимальное время работы)
Вот длинное, но быстрое решение:
Python:
from collectins import Counter


def get_ls(n):
    """Разложить число на множители"""
    result = []
    i = 2
    while i < n:
        if n % i == 0:
            n /= i
            result.append(i)
        else:
            i += 1
    result.append(int(n))
    return result


def gcd(a, b):
    while b:
        a, b = b, a % b
    return a


n = int(input())
c = []
s = 0
ls = get_ls(n)

kkk = dict(Counter(ls)).items()
d = [k for k, _ in kkk]
m = [v for _, v in kkk]
k = [0 for _ in range(len(set(ls)))]
ln = range(len(m))

try:
    while True:
        r = 1
        for i1, i2 in zip(d, k):
            r *= i1 ** i2
        c.append(r)
        x = [j for j in c[:-1] if gcd(r, j) == 1]
        s += len(x)

        k[0] += 1
        for i in ln:
            if k[i] > m[i]:
                k[i] = 0
                k[i + 1] += 1  # IndexError
except IndexError:
    pass
print(s)
 

Форум IT Специалистов