Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Количество клеток внутри окружности

Автор: Dranik7 9.10.2010 22:17

Текст задачи:

На клеточной бумаге нарисовали окружность целого радиуса с центром на пересечении линий.
Найти количество клеток, целиком лежащих в этой окружности (напр.: радиус = 3, клеток = 16)

Помогите решить.

Автор: TarasBer 9.10.2010 22:29

c := 0;
for i := 1 to r - 1 do inc(c, trunc(sqrt(sqr®-sqr(i)));

Автор: Dranik7 9.10.2010 22:34

TarasBer, спасибо

Есть ли другие способы решений?
получается кол-во клеток = 2 в степени радиуса

Автор: volvo 9.10.2010 22:39

Цитата
Помогите решить.
"Помогите" и "решите за меня"/"дайте готовое решение" - это несколько разные вещи, тебе не кажется? Уже вторая тема, а от тебя НИ ОДНОЙ ПОПЫТКИ что-то сделать самостоятельно. Только стремление нагадить другим (да, да, это я про стиль написания сообщения. Как ты думаешь, какой-то из поисковиков найдет этот пост по запросу на русском языке? Нет. Это называется вредительство. "Сам возьму, а другим - нечего делать").

Возьми и перепечатай заголовок и текст первого сообщения на нормальном русском языке, и использованием ТОЛЬКО русских букв. Иначе ты рискуешь привлечь к себе пристальное внимание администрации...

Автор: Dranik7 9.10.2010 22:45

Цитата(volvo @ 9.10.2010 19:39) *

"Помогите" и "решите за меня"/"дайте готовое решение" - это несколько разные вещи, тебе не кажется? Уже вторая тема, а от тебя НИ ОДНОЙ ПОПЫТКИ что-то сделать самостоятельно. Только стремление нагадить другим (да, да, это я про стиль написания сообщения. Как ты думаешь, какой-то из поисковиков найдет этот пост по запросу на русском языке? Нет. Это называется вредительство. "Сам возьму, а другим - нечего делать").

Возьми и перепечатай заголовок и текст первого сообщения на нормальном русском языке, и использованием ТОЛЬКО русских букв. Иначе ты рискуешь привлечь к себе пристальное внимание администрации...


Если вы думаете что я не пытаюсь решить самостоятельно то ошибаетесь. Я сижу над этими задачами немало времени.
А насчет текста извиняюсь.

Автор: TarasBer 9.10.2010 22:56

> получается кол-во клеток = 2 в степени радиуса

Метод неполной математической индукции по первым двум числам, да?
Если тебе непонятно, что ответ должен быть O(r^2), то остаётся только

Изображение

Автор: Dranik7 11.10.2010 0:29

Цитата(TarasBer @ 9.10.2010 19:56) *

> получается кол-во клеток = 2 в степени радиуса

Метод неполной математической индукции по первым двум числам, да?
Если тебе непонятно, что ответ должен быть O(r^2), то остаётся только


TarasBer, зачем так строго? мне много чего непонятно и я многого не знаю, так как учусь в 10 классе. А в армию сходить успею. А за решение ещё раз спасибо.

Автор: TarasBer 11.10.2010 1:02

Ты вообще пробовал сам нарисовать окружность на клетчатом листе бумаги?
А то ведь сдашь решение ровно в том виде, в котором я написал...

Автор: Dranik7 11.10.2010 1:06

TarasBer, пробовал.

Не сдам, т.к. как кое-что все же я понимаю.

Объясни зачем в этом коде выделенное

c := 0;
for i := 1 to r - 1 do inc(c, trunc(sqrt(sqr®-sqr(i)));

Автор: TarasBer 11.10.2010 1:19

Оператор inc изучал?

Автор: Dranik7 11.10.2010 2:34

Цитата(TarasBer @ 10.10.2010 22:19) *

Оператор inc изучал?

Да.

Получается "c" надо сложить с "trunc(sqrt(sqr®-sqr(i)" , а c=0.

Автор: Unconnected 11.10.2010 2:48

Цитата
Получается "c" надо сложить с "trunc(sqrt(sqr®-sqr(i)" , а c=0.


Наоборот, trunc(sqrt(sqr®-sqr(i) нужно сложить с С. То есть, результат будет в С. Эквивалентно с:=c+trunc(sqrt(sqr®-sqr(i).

Автор: TarasBer 11.10.2010 3:42

Мда, если мы сложим trunc(...) с c, а не наоборот, то куда кладётся результат и в чём смысл данной операции?
Записать код, посмотреть в отладчике хотя бы пробовал?

"В окне автобуса поплыл **аный военкомат..."

Автор: Lapp 11.10.2010 5:53

Цитата(TarasBer @ 11.10.2010 0:42) *
"В окне автобуса поплыл **аный военкомат..."
Тарас, заканчивай оффтопить, да еще и давить человеку на психику.. mad.gif

Dranik7, обнуление перменной c нужно, чтоб потом ее использовать для накапливания количества подсчитываемых клеток. На каждом проходе цикла добавляем к c количество найденных клеток. Для этого в самом начале в c должен быть 0. Согласен?

TaracBer, приведенный тобой код может неслабо ошибаться.. Сможешь исправить?

Автор: TarasBer 11.10.2010 12:48

> TarasBer, приведенный тобой код может неслабо ошибаться.. Сможешь исправить?

Я надеюсь на то, что человек таки догадается сравнить его результаты со своим подсчётом клеточек вручную и умножить результат на нужное число.

Автор: Lapp 11.10.2010 14:12

Цитата(TarasBer @ 11.10.2010 9:48) *
Я надеюсь на то, что человек таки догадается сравнить его результаты со своим подсчётом клеточек вручную и умножить результат на нужное число.
А, нет, я не про то.. Это я не заметил smile.gif
Я про другое.

Автор: TarasBer 11.10.2010 14:20

Пришлось скопировать этот код себе и запустить.
Оказывается, я забыл одну закрывающуюся скобочку.
Да, смайлофобия даже тут проявилась.

Автор: Lapp 11.10.2010 14:29

Цитата(TarasBer @ 11.10.2010 11:20) *
Пришлось скопировать этот код себе и запустить.
Оказывается, я забыл одну закрывающуюся скобочку.
Да, смайлофобия даже тут проявилась.
lol.gif lol.gif lol.gif lol.gif lol.gif lol.gif lol.gif lol.gif
бойся нассссс!!! )) (когда люди придумывают себе фобии, их легко третировать))

Кстати, постарайся, чтоб значок "R в кружке" не пролез.

Но я все равно говорил не о том!..

Автор: TarasBer 11.10.2010 14:53

Больше ничего не вижу.

Автор: Lapp 11.10.2010 15:02

Цитата(TarasBer @ 11.10.2010 11:53) *
Больше ничего не вижу.
Я имел в виду вот, что.
sqrt может дать вычислительную ошибку в последнем знаке. Особенно опасно это, когда тройка x,y,r составляет Пифагоровы числа. Ошибка в минус отбросит эту клетку после операции trunc. Это может, грубо говоря, выкинуть половину из таких клеток (нет, меньше половины, но все равно..)

Автор: TarasBer 11.10.2010 15:16

Я про это думал.
Под корнем число целое.
sqrt от точного целого квадрата ошибки не даёт.

Специально ещё раз проверил

for i := 1 to 40000 do if i <> trunc(sqrt(sqr(i))) then WriteLn(i);
WriteLn('END');
ReadLn;

Автор: Lapp 11.10.2010 15:21

Цитата(TarasBer @ 11.10.2010 12:16) *
sqrt от точного целого квадрата ошибки не даёт.
Хм.. интересно, на каком уровне это делается - функции или машинных кодов?
Тогда вопрос снят, извиняюсь

+1 за то, что поверял )

Автор: TarasBer 11.10.2010 15:38

Сам квадратный корень считается точно.


procedure WriteE(e: extended);
var
a: record
mant: array [0 .. 7] of byte;
ex: word;
end absolute e;
i: integer;

begin
Write(IntToHex(a.ex, 4), ' ');
for i := 7 downto 0 do Write(IntToHex(a.mant[i], 2));
WriteLn;
end;

begin
for i := 1 to 40000 do writee(sqrt(sqr(i)));
WriteLn('END');
writee(1-5e-20);
writeln(trunc(1-5e-20));
ReadLn;
end.



Ровный ряд нулей в правом столбике доказывает это.

Я не знаю, как там сопроцессор спаян, если там корень столбиком считается (в этот метод, правда, сам вкурить не могу), то там всё точно.
Trunc отрезает всё, даже если там сплошные единицы, последние две строки вывода доказывают это.

Автор: Lapp 11.10.2010 16:04

Цитата(TarasBer @ 11.10.2010 12:38) *
Я не знаю, как там сопроцессор спаян, если там корень столбиком считается
Собственно, да, там же лишний разряд должен учитываться.. так что округление точное.

Автор: prednisolone acetate ophthalmic 15.11.2021 2:18

Achat Rapide Kamagra

Автор: what drugs should not be taken w 7.12.2021 23:44

Erectile Dysfunction Drugs

Автор: finasteride without prescription 19.12.2021 16:09

marijuana and cialis