Форум » Обработка целых чисел » ege17 № 47 PascalABC » Ответить

ege17 № 47 PascalABC

Антонина: Здравствуйте. В условии задачи надо найти произведение. В Python это делается в "лоб", т.к. нет ограничений по длине числа (например так): k,mi=0,9415 p=1 for i in range(2057,9414+1): s=i%10+i//10%10 if s!=5 and i%4!=0 and i%5!=0 and i%41!=0: p*=i if i<mi: mi=i print(mi,p%1000) Получаем нужный ответ: 2057 192 А вот как быть тем, кто учится программировать на PascalABC : var mi,rez: integer; p:double; begin p := 1; for var i := 9414 downto 2055 do begin if ((i mod 10)+ (i mod 100 div 10))<>5 then if (i mod 4<>0) and (i mod 5 <>0) and (i mod 41 <>0) then begin p:=p*i; writeln(p); mi := i end; end; rez:=(trunc(p)) mod 1000; writeln(mi,' ',rez); end. Результат (фрагмент): 2.67271080942943E+306 8.0181324282883E+306 1.60362648565766E+307 1.60362648565766E+307 1.44326383709189E+308 ∞ ∞ ∞ ∞ ∞ Какой математический алгоритм нужно применить, чтобы получить ответ? Спасибо.

Ответов - 2

Поляков: Антонина пишет: Какой математический алгоритм нужно применить, чтобы получить ответ? Проблема в том, что при вычислениях получается очень большое число. Но нам нужны только три его последние цифры. Выход такой: заменить p:=p*i; на p:=(p*i) mod 1000;.

Антонина: Спасибо огромное. Моя ошибка была в следующем: p:=p * (i mod 1000); {пробовала так}



полная версия страницы