Проблема форматирования в задаче программирования - PullRequest
0 голосов
/ 15 июня 2019

uVA 382 (https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=318) довольно просто: с учетом числа, скажите, является ли оно идеальным, несовершенным или обильным числом. Но, похоже, у меня проблема с форматированием. Вот что хочет эта проблема:

Первая строка вывода должна гласить «ВЫХОД СОВЕРШЕНСТВА». Следующие N строк вывода должны перечислять каждое входное целое число, является ли оно совершенным, неполным или обильным, как показано в примере ниже. Формат count: отраженные целые числа должны быть выровнены по правому краю в первых 5 пробелах строки вывода, а затем двумя пробелами с последующим описанием целого числа. Последнюю строку вывода следует читать «КОНЕЦ ВЫХОДА».

Вот мой код:

def sum_divisors(n):
    sm = 0
    for i in range(1, n):
        if n % i == 0:
            sm += i
    return sm
n = list(map(int, input().split()))
n.pop()
print("PERFECTION OUTPUT")
for i in n:
    sm = sum_divisors(i)
    if sm == i:
        state = "PERFECT"
    if sm < i:
        state = "DEFICIENT"
    if sm > i:
        state = "ABUNDANT"
    spaces = ' ' * (5 - len(str(i)))
    print("{}{}  {}".format(spaces, i, state))
print("END OF OUTPUT")

Теперь я уже пытался использовать uDebug со многими различными выходами, и я получил правильный ответ, и я не думаю, что проблема в алгоритме. Я думаю, что это о форматировании вывода, но не знаю, что я ошибся.

1 Ответ

0 голосов
/ 16 июня 2019

Есть ли конкретное сообщение об ошибке, которое нарушает форматирование?Я не вижу проблемы с этим от руки.В зависимости от того, насколько строгим является тестирование, рассмотрите разницу между входными данными:

15 28 6 56 60000 22 496 0

и:

15 28 6 56 60000 0 22 496

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

Вот доработка вашего кода для решения этой проблемы, а также предложения по стилю:

def sum_divisors(n):
    summation = 0

    for divisor in range(1, n // 2 + 1):
        if n % divisor == 0:
            summation += divisor

    return summation

numbers = map(int, input().split())

print("PERFECTION OUTPUT")

for number in numbers:
    if number == 0:
        break

    summation = sum_divisors(number)

    if summation < number:
        status = "DEFICIENT"
    elif summation > number:
        status = "ABUNDANT"
    else:
        status = "PERFECT"

    print("{:5}  {}".format(number, status))

print("END OF OUTPUT")

Посмотрите, будет ли это работать лучше для вас,В противном случае включите точное сообщение об ошибке, сгенерированное вашей исходной программой.

...