На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение



Сообщение: 15
ссылка на сообщение  Отправлено: 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))


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 7 [только новые]


Администратор




Сообщение: 3904
ссылка на сообщение  Отправлено: 16.02.23 22:05. Заголовок: Вы удивитесь. Матема..


Вы удивитесь. Математически там всегда деление нацело. А вот решение:
print( 1000*5*6*7 / (2*2*2) ) 


___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 16
ссылка на сообщение  Отправлено: 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

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Сообщение: 3908
ссылка на сообщение  Отправлено: 18.02.23 13:49. Заголовок: Ar3turrr пишет: Подр..


Ar3turrr пишет:
 цитата:
Подразумевалось, что ответ выходит при замене / в условии на //, то есть на деление с округлением к наименьшему.

Да, потому что разделив не нацело (/) вы разу перешли к вещественным числам и потеряли в точности. И вся длинная арифметика Питона уже не работает.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 1
ссылка на сообщение  Отправлено: 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)
В чем ошибка, подскажите пожалуйста

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 23
ссылка на сообщение  Отправлено: 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))



Вероятно, это из-за отсутствия отступов.

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
ссылка на сообщение  Отправлено: 05.03.23 09:39. Заголовок: Здравствуйте, Конста..


Здравствуйте, Константин Юрьевич!

Подскажите, пожалуйста, как мы должны прийти к такому решению?

Спасибо: 0 
Цитата Ответить
Администратор




Сообщение: 3925
ссылка на сообщение  Отправлено: 05.03.23 09:43. Заголовок: Анна23 пишет: Подска..


Анна23 пишет:
 цитата:
Подскажите, пожалуйста, как мы должны прийти к такому решению?

Вручную. Если вы видите, что в задаче большие числа или получается слишком большое число рекурсивных вызовов, это намек на то, что решать ее нужно на бумаге. Или динамическим программированием, если на бумаге не получилось. Но тут - точно на бумаге, особенно если в языке программирования нет длинной целочисленной арифметики.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 84
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет