fork(1) download
  1. from itertools import chain
  2.  
  3. def prime(x):
  4. '''Является ли x простым.'''
  5. if x <= 1: return False
  6. if x%2 == 0 or x%3 == 0: return x <= 3
  7. return all(x%div and x%(div+2) for div in range(5, int(x**0.5) + 1, 6))
  8.  
  9. def primes(n):
  10. '''Простые числа, меньшие n.'''
  11. prime = [True] * n
  12.  
  13. for i in range(3, int(n**0.5) + 1, 2):
  14. if prime[i]:
  15. prime[i*i::2*i] = [False] * ((n-i*i-1) // (2*i)+1)
  16. return chain([2] if n > 2 else [], (i for i in range(3, n, 2) if prime[i]))
  17.  
  18. def solve(x):
  19. '''Представления x суммами двух простых чисел.'''
  20. return ({'a': x - match, 'b': match} for match in primes(x//2 + 1) if prime(x - match))
  21.  
  22. def lang_count(n, eds):
  23. '''Склонение счётного слова. Eds — строка вида один/два/много, например, "коробка/коробки/коробок".'''
  24. return eds.split('/')[2 if n%10 == 0 or n%10 > 4 or n//10%10 == 1 else 0 if n%10 == 1 else 1]
  25.  
  26. def main():
  27. x = None
  28. try:
  29. x = int(input("Введите чётное число, большее двух: "))
  30. except ValueError:
  31. print("Это не число.")
  32. return
  33.  
  34. if x % 2 != 0 or x <= 2:
  35. print("Число не подходит.")
  36. return
  37.  
  38. n = 0
  39. def note(item):
  40. nonlocal n
  41. n = n + 1
  42. return item
  43. pretty = "{x} = {solutions}".format(x = x, solutions = " = ".join("{a}+{b}".format(**r) for r in map(note, solve(x))))
  44. if n > 1: pretty += " ({n} решени{ed})".format(n = n, ed = lang_count(n, "е/я/й"))
  45. if not n: pretty = "Решений не найдено!"
  46. print(pretty)
  47.  
  48. main()
Success #stdin #stdout 0.02s 9936KB
stdin
64
stdout
Введите чётное число, большее двух: 64 = 61+3 = 59+5 = 53+11 = 47+17 = 41+23 (5 решений)