Автор | Сообщение |
|
Отправлено: 16.02.23 21:58. Заголовок: (№ 5604) (А. Куканова)
Условие записано неправильно. Ответ выходит только при делении нацело: F(n) = 2 · F(n + 1) // (n + 1), если 1 ≤ n < 5000 def F(n): k = 1 for i in range(1, n + 1): k *= i if n >= 5000: return k if n < 5000 and n >= 1: return 2 * F(n + 1) // (n + 1) import sys sys.setrecursionlimit(10000) print(1000 * F(7) / F(4))
|
|
|
Ответов - 7
[только новые]
|
|
|
| Администратор
|
Сообщение: 3904
|
|
Отправлено: 16.02.23 22:05. Заголовок: Вы удивитесь. Матема..
Вы удивитесь. Математически там всегда деление нацело. А вот решение: print( 1000*5*6*7 / (2*2*2) )
|
|
|
|
Отправлено: 17.02.23 15:33. Заголовок: Подразумевалось, что..
Подразумевалось, что ответ выходит при замене / в условии на //, то есть на деление с округлением к наименьшему. (№ 5604) (А. Куканова) Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями: F(n) = n!, если n ≥ 5000, F(n) = 2 · F(n + 1) / (n + 1), если 1 ≤ n < 5000. Чему равно значение выражения 1000 · F(7) / F(4)? Иначе, если написать код по предложенным условиям, то он будет выдавать ошибку: def F(n): k = 1 for i in range(1, n + 1): k *= i if n >= 5000: return k if n < 5000 and n >= 1: return 2 * F(n + 1) / (n + 1) import sys sys.setrecursionlimit(10000) print(1000 * F(7) / F(4)) Вывод к программе: [Previous line repeated 997 more times] OverflowError: integer division result too large for a float def F(n): k = 1 for i in range(1, n + 1): k *= i if n >= 5000: return k if n < 5000 and n >= 1: return 2 * F(n + 1) // (n + 1) import sys sys.setrecursionlimit(10000) print(1000 * F(7) / F(4)) Вывод к программе: 26250.0
|
|
|
|
| Администратор
|
Сообщение: 3908
|
|
Отправлено: 18.02.23 13:49. Заголовок: Ar3turrr пишет: Подр..
Ar3turrr пишет: цитата: | Подразумевалось, что ответ выходит при замене / в условии на //, то есть на деление с округлением к наименьшему. |
|
Да, потому что разделив не нацело (/) вы разу перешли к вещественным числам и потеряли в точности. И вся длинная арифметика Питона уже не работает.
|
|
|
|
Отправлено: 02.03.23 23:26. Заголовок: У меня при проверке ..
У меня при проверке Вашей программы ..... if n < 5000 and n >= 1: return 2 * F(n + 1) // (n + 1) import sys sys.setrecursionlimit(10000) print(1000 * F(7) / F(4)) .... выводит Process finished with exit code -1073741571 (0xC00000FD) В чем ошибка, подскажите пожалуйста
|
|
|
|
Отправлено: 04.03.23 13:34. Заголовок: bolgova23 пишет: if..
bolgova23 пишет: цитата: | if n < 5000 and n >= 1: return 2 * F(n + 1) // (n + 1) import sys sys.setrecursionlimit(10000) print(1000 * F(7) / F(4)) |
| Вероятно, это из-за отсутствия отступов.
|
|
|
|
Отправлено: 05.03.23 09:39. Заголовок: Здравствуйте, Конста..
Здравствуйте, Константин Юрьевич! Подскажите, пожалуйста, как мы должны прийти к такому решению?
|
|
|
|
| Администратор
|
Сообщение: 3925
|
|
Отправлено: 05.03.23 09:43. Заголовок: Анна23 пишет: Подска..
Анна23 пишет: цитата: | Подскажите, пожалуйста, как мы должны прийти к такому решению? |
|
Вручную. Если вы видите, что в задаче большие числа или получается слишком большое число рекурсивных вызовов, это намек на то, что решать ее нужно на бумаге. Или динамическим программированием, если на бумаге не получилось. Но тут - точно на бумаге, особенно если в языке программирования нет длинной целочисленной арифметики.
|
|
|
|