Помощь - Поиск - Пользователи - Календарь
Полная версия: Количество клеток внутри окружности
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Dranik7
Текст задачи:

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

Помогите решить.
TarasBer
c := 0;
for i := 1 to r - 1 do inc(c, trunc(sqrt(sqr®-sqr(i)));
Dranik7
TarasBer, спасибо

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

Возьми и перепечатай заголовок и текст первого сообщения на нормальном русском языке, и использованием ТОЛЬКО русских букв. Иначе ты рискуешь привлечь к себе пристальное внимание администрации...
Dranik7
Цитата(volvo @ 9.10.2010 19:39) *

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

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


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

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

Изображение
Dranik7
Цитата(TarasBer @ 9.10.2010 19:56) *

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

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


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

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

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

c := 0;
for i := 1 to r - 1 do inc(c, trunc(sqrt(sqr®-sqr(i)));
TarasBer
Оператор inc изучал?
Dranik7
Цитата(TarasBer @ 10.10.2010 22:19) *

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

Да.

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


Наоборот, trunc(sqrt(sqr®-sqr(i) нужно сложить с С. То есть, результат будет в С. Эквивалентно с:=c+trunc(sqrt(sqr®-sqr(i).
TarasBer
Мда, если мы сложим trunc(...) с c, а не наоборот, то куда кладётся результат и в чём смысл данной операции?
Записать код, посмотреть в отладчике хотя бы пробовал?

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

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

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

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

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

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

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

for i := 1 to 40000 do if i <> trunc(sqrt(sqr(i))) then WriteLn(i);
WriteLn('END');
ReadLn;
Lapp
Цитата(TarasBer @ 11.10.2010 12:16) *
sqrt от точного целого квадрата ошибки не даёт.
Хм.. интересно, на каком уровне это делается - функции или машинных кодов?
Тогда вопрос снят, извиняюсь

+1 за то, что поверял )
TarasBer
Сам квадратный корень считается точно.

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
Цитата(TarasBer @ 11.10.2010 12:38) *
Я не знаю, как там сопроцессор спаян, если там корень столбиком считается
Собственно, да, там же лишний разряд должен учитываться.. так что округление точное.
prednisolone acetate ophthalmic
Achat Rapide Kamagra
what drugs should not be taken w
Erectile Dysfunction Drugs
finasteride without prescription
marijuana and cialis
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.