2016-11-09 2 views
0

Я пытаюсь создать программу, которая вычисляет числа Брауна или числа, которые могут быть выражены как n!+1 = m^2 где m - целое число, и выполнение этого через создает слишком большое число.Python: Коричневые числа и переполнение

Любая идея, как исправить это? (Существует также метод абацистского стиля, но он экспоненциально длиннее)

n = 40320 
f = 9 
while True: 
    x = (n+1)**(.5) 
    if isinstance(x, int): 
     break 
    else: 
     n = n*f 
     f = f+1 
print(f) 
print(n) 
print(input(" ")) 

* n is 8!

+0

Если я что-то не хватает, вы никогда не будете вычислять 'n!'. 'n' и' f' всегда увеличиваются –

+0

8! = 40320, а факториал - 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1, так что 9 * 8! = 9! –

+0

Правильно ... И в какой-то момент вы столкнетесь с ошибкой переполнения, независимо от любого предоставленного «исправления». Так в чем проблема? –

ответ

0

Ваш цикл никогда не закончится, потому что x никогда не будет типа int:

>>> 4**0.5 
2.0 
>>> isinstance(4**0.5, int) 
False 
>>> isinstance(4**0.5, float) 
True 

Могу ли я предложить эту альтернативу:

x = (n+1)**(.5) 
x = int(round(x)) 
if x ** 2 == n + 1: 
    break 

Это должно также обрабатывать вопросы точности с плавающей запятой.

РЕДАКТОР: вышеизложенное было простым методом для небольших чисел. Чтобы проверить, является ли большое число идеальным квадратом, существуют и другие методы, такие как этот: https://stackoverflow.com/a/2489519/2482744

+0

Это по-прежнему заканчивается ошибкой «OverflowError: int too large to convert to float» –

+0

@ Z.B, где это происходит? Я не вижу, где я конвертирую в float. –

+0

строка 4, в которой x равно –

Смежные вопросы