Автор
|
Тема: Кто прав ???
|
MishaZ |
опубликован 03-02-2002 09:15 MSK
У нас тут не давно школьная олимпиада былп так вот там одна из задач была такая... найти сумму ряда S=1+1/2^2+1/3^2+......1/2002^2 используя только одну переменную. ну так вот у нас там такая система что вопросы жюри в процессе написания олимпиады можно задавать только так чтоб на них можно было ответить либо да либо нет ...ну я и спросил регистры процессора переменными являются? ..а они мне....ДА ну типа значит в процессе решения задаяи их использовать низя. Я съел но потом до меня дошло что всё равно применяя ту или иную арифмеитическую операцию мы используем регистры процессора ....а заначит с их ответом данную задачу решить невозможно ..вот с этим я на них и наехал а они отпираются... Так кто прав ????
|
Zzzaraza
|
опубликован 03-02-2002 09:39 MSK
дык, используем, но не явно, а ты, как я понял, хотел явно указать их в программе. |
MishaZ
|
опубликован 03-02-2002 09:52 MSK
Хм--м-м-м ну в воппросе не звучало что то про явно или не явное обращение.....тут уже юридические тонкости...=) |
7in
|
опубликован 03-02-2002 22:12 MSK
А олимпиада-то по Паскалю, так что ассемблером пользоваться нельзя :) Это даже не юридические тонкости. Можно было бы тогда написать программу с 2-мя переменными, откомпилировать и через Exec запустить из главной, поулчив результат с использованием 1-й переменной. Об этом ведь тоже не сказано в условии...Вообще говоря, из задачи следует: For использовать нельзя, так что придётся только While или Repeat Until, либо вообще без цикла... Можно, конечно, подумать над сложными математическими формулами, но можно поступить проще :))) Результат всегда будет >1 и <2, т.е. нас волнует только дробная часть, поэтому целую часть можно использовать для цикла: {$N+} Var Sum: Extended; i: Word; Begin { Решение... } Sum := 2; Repeat Sum := Sum + 1/Sqr(Trunc(Sum)) + 1 Until Sum >= 2003; Sum := Sum - 2002; WriteLn(Sum: 0: 14); { Проверка... } Sum := 0; For i := 1 to 2002 do Sum := Sum + 1/Sqr(i); WriteLn(Sum: 0: 14) End. |
Zzzaraza
|
опубликован 04-02-2002 17:38 MSK
э-ээх, чему вас в школе только учили, проще нада, проще :)var s:real; function sum(s:real):real; s=s+1; if s<2003 then begin sum:=sum(s)+1/(s*s); end; end; begin write (sum(0)); end. при желании мона и без переменных (Var)обойтись,IMHO функция не есть переменная |
NOPIK
|
опубликован 05-02-2002 08:55 MSK
Черт побери! А ведь верно! Переменные функций не являются переменными программы. Так что, и огород не нужен... Только в олимпиадных задачах обычно оговаривается запрет на использование дополнительных функций (Именно поэтому...) :-( |
7in
|
опубликован 05-02-2002 23:17 MSK
2 Zzzaraza: А если понадобится считать до 20000? :) Для твоего варианта нужно уже 2004*(2+6)=16kb стека! Хотя для данного случая нормально (оценил, блин :) |
Zzzaraza
|
опубликован 06-02-2002 07:04 MSK
Млин обшибок у меня тама куча :(, но это не важно, кому нада тот разберется, а вообще это изврещение полнейшее...но прикольно однако:) |
murph
|
опубликован 06-02-2002 14:09 MSK
А вот если считать надо до 1е11, или более, то переменных уже не надо вовсе...А решение от заразы - это клево. Ценю. |
Gavr
|
опубликован 14-02-2002 10:58 MSK
Зараза ты мой кумир! |