//uses PT4;
Function IsPower5(K:Integer):Boolean;
Begin
IsPower5:=(frac(logn(5,k))=0);
end;
var
k:integer;
c:byte;
begin
//Task('Proc26');
for var i:=1 to 10 do
begin
read(k);
if IsPower5(k) then inc(c);
end;
writeln(c);
end.
Помогите пожалуйста!
Подскажите где я ошибся в написании кода… Если при написании кода для решения задачника “Task(‘Proc26’)” - при вводе параметра 125 т.е. 5^3 в функции IsPower5 присваивается значение False, тоже самое и при вводе 5^6??? т.е. frac(logn(5,125)) не равно 0, при этом frac(3) =0???
Надо было создать отдельный файл и протестировать в нём чему на самом деле равно то выражение когда дают 125:
begin
// N99 значит 99 знаков после запятой. Иначе округляет
Frac(LogN(5,125)).ToString('N99').Print;
end.
Знак = никогда не должен применяться к значениям типа real, потому что их значение хранится с погрешностью. Единственное исключение - если вы делаете какие то особые оптимизации.
Правильнее, да и эффективнее по скорости - будет использовать div и mod. Операции с целыми всегда работают быстрее и без погрешностей.
1.)Не понимаю почему дробная часть от результата “Log 125 по основанию 5” может не равняться нулю, при том что дробная часть"Log 25(625 или 3125) по основанию 5" = 0? Да если принудительно поставить “Frac(5) вместо Frac(LogN(5,125))” то ответ = 0, т.е. получается “Log 125 по основанию 5” не равно 5?
2.)В данном упражнении не могу использовать mod или div, т.к. степень может быть разной и делитель остаётся неизвестным!
Огромное спасибо!
я не понимаю, ведь с точки зрения математики тут не может быть погрешности…
Log 5 по основанию 5=1
Log 25 по основанию 5=2
Log 125 по основанию 5=3
Log 625 по основанию 5=4
Log 3125 по основанию 5=5 и т.п.
Да Log 12_6_ по основанию 5=3.с дробной частью!
И соответственно Frac(от параметров являющихся степенью числа 5) = 0, так и получается, но вот при параметре 125-т.е. степень 3 появляется дробная часть, а параметр -625, т.е. степень 4 дробной части нет.
2.
35 тоже делится на 5 без остатка, но 35 не является целым параметром степени числа 5. Мне же нужно понять по условию задачи… сколько из 10 заданных по условию задачи целых параметров являются целыми степенями числа 5… И первым действием я вычисляю степень в которую надо возвести 5, чтоб получить заданный параметр - logn(5,k). Вторым действием выясняю есть ли дробная часть у полученной степени, если нет, то засчитываю параметр как удовлетворяющий условию задачи… И получается, что изменив условие и проверить 2 параметра
...for var i:=1 to 2 do...
125 и 625 получится, что 625 является целой степенью числа 5, а 125 нет…
С точки зрения математики в дроби 1/10 = 0.1 погрешности нет. Но попробуйте перевести 0.1 в двоичную систему счисления…
И попробуйте такой код. Сумеете понять причину - считайте, что немножко продвинулись по дороге познания машинной арифметики вещественных )))
begin
var a := 0.1;
var s := 0.0;
loop 10 do
s += a;
// получилась ли единица?
Writeln(s-1.0:20:16);
Print(s = 1)
end.
Как знать) Может и Вам не стоит, т.к. математика это тоже точная наука, увы… а понять и суть проблемы и тем более объяснить её не смогли на языке математики…
Это для некоторых норма: приходим без знаний, но по умолчанию предполагаем, что что тут нас все сразу сбегутся учить, ибо как же иначе: “Ой, кто к нам пришел!”. Ну а если что не так - можно и куснуть попытаться, ото ж на него, всего из себя такого, посмели взглянуть косо, не обласкали…
Таких не берут в космонавты!
Spaceman! Spaceman!
(Манго-Манго)
Вы, в итоге, попробовали? Или таки так и ждали что вам всё разжуют?
В программировании каждый день приходится самому себе разжовывать. Как в первый год программирования, так и в 50. Это основная деятельность которой программистов. Когда всё понятно - написание кода тривиально.
Учитесь разбираться пока есть молодость и подсказки и тех кто знает больше, потому что и то и то быстро закончится.