#python
Вопрос:
Я новичок в python и просто ради проверки своих навыков попытался создать программу, чтобы проверить, может ли данное целое число быть выражено в виде суммы двух простых чисел, код для которых я упомянул ниже —
a = int(input('Enter the number: '))
def prime(b):
for i in range(2, b):
while b % i == 0:
pass
else:
return b
if a < 3:
print("The number is too short to be tested")
else:
for i in range(2, a):
for j in range(2, a):
d = prime(i)
e = prime(j)
if d e == a:
print("It can be expressed as a sum of prime numbers")
break
else:
print("The number can not be expressed as a sum of prime numbers")
Ошибка гласит TypeError: unsupported operand type(s) for : 'NoneType' and 'NoneType'
Я понимаю, что первый класс должен сначала вернуть значение, поэтому я сохранил возвращенные значения в переменных d и e соответственно, но напрасно. Любая помощь в этом будет высоко оценена.
Комментарии:
1. Что вы ожидаете, что ваша функция
prime()
вернет данный параметр?2. Не могли бы вы предоставить полную обратную информацию об ошибках?
3.
prime
следует просто вернутьTrue
илиFalse
, и вы можете использовать эти результаты, чтобы решить, хотите ли вы это проверитьi j == a
.
Ответ №1:
Ваша функция prime
-делать слишком много вещей. Просто верните True
его, если оно простое, False
в противном случае.
def prime(b):
for i in range(2, b):
if b % i == 0:
return False
return True
Вам также не нужно перебирать два диапазона: просто проверьте, являются ли i
и a - i
простыми (потому i a - i == a
что по определению). Кроме того, поскольку i
и a - i
симметричны a/2
, вам не нужно перебирать весь диапазон значений от 2 до a
.
a = int(input('Enter the number: '))
if a < 3:
print("The number is too short to be tested")
else:
for i in range(2, a // 2 1):
if prime(i) and prime(a - i):
print("It can be expressed as a sum of prime numbers")
break
else:
print("The number can not be expressed as a sum of prime numbers")
В качестве упражнения адаптируйте цикл так, чтобы вам не нужно было учитывать все значения от 2 до a// 2 1
, только 2 и нечетные.
Ответ №2:
Я предлагаю вам вернуть значение по умолчанию, если оператор b % i == 0
никогда не был статистизирован prime()
. Также, пожалуйста, убедитесь, что d и e действительно существуют до этого заявления (d e) == a
Пример: (должно выполняться как есть)
a = int(input('Enter the number: '))
def prime(b, default=None):
for i in range(2, b):
if not b % i == 0:
return b
return default
if a < 3:
print("The number is too short to be tested")
else:
for i in range(2, a):
for j in range(2, a):
d, e = prime(i), prime(j)
if d and e and (d e) == a:
print("It can be expressed as a sum of prime numbers")
break
print("The number can not be expressed as a sum of prime numbers")
Ответ №3:
a = int(input('Enter the number: '))
def prime(b):
for i in range(2, b):
if b % i == 0:
continue
else:
return b
if a < 3:
print("The number is too short to be tested")
else:
for i in range(3, a 1):
for j in range(3, a 1):
d = prime(i)
e = prime(j)
if d e == a:
print("It can be expressed as a sum of prime numbers")
break
else:
print("The number can not be expressed as a sum of prime numbers")
Этот вариант должен сработать
Комментарии:
1. Я попробовал ваш код и получил ту же ошибку, о которой сообщалось.
2. это происходит потому
range(2, a)
, что производит2
в первом цикле иprime(2)
естьNone
. Я исправил свой ответ3. Хорошо, но теперь , когда я вхожу
5
, я получаю отрицательный ответ. Я бы ожидал, что такая программа, как эта, будет знать, что2 3 = 5