Помощь - Поиск - Пользователи - Календарь
Полная версия: Простенький линейный алгоритм?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
OneDose
Имеется такое задание:
Хозяин хочет оклеить обоями квартиру. Определить количество необходимых рулонов и затрат на их приобретение.

Мне очень стыдно, но не могу решить ее используя линейный алгоритм blink.gif
Как я прнимаю, отношение площади стен к площади рулона даст количество рулонов, но количество рулонов должно быть целым числом...
volvo
Ну, так вот и проверь, делится ли площадь комнаты нацело на площадь рулона (перефразируем: нулевой ли остаток от деления площади стен на площадь рулона; для получения остатка целочисленного деления есть MOD). Если остаток НЕнулевой, то к частному (целочисленное деление - это DIV) придется прибавить еще 1.

Это все верно только если площади (и стен и рулонов) - целочисленные. Поскольку ты никаких вводных не дал, я трактую это так, как нравится мне, а мне удобнее считать все данные именно целочисленными, а не вещественными.
TarasBer
Цитата(volvo @ 17.06.2010 12:57) *

Ну, так вот и проверь, делится ли площадь комнаты нацело на площадь рулона (перефразируем: нулевой ли остаток от деления площади стен на площадь рулона; для получения остатка целочисленного деления есть MOD). Если остаток НЕнулевой, то к частному (целочисленное деление - это DIV) придется прибавить еще 1.



Может, вместо взятия остатка проще сразу считать (a+b-1) div b?
volvo
Ну, чего и следовало ожидать, оптимизация начинается... ПРОЩЕ - с div/mod... Тебе БЫСТРЕЕ и КОРОЧЕ надо? Пиши в маш. кодах, на кой тебе компилятор? Человек только начинает изучать язык, нет, тебе надо обязательно прийти и написать какую-то хрень, чтоб отбить у него желание начинать разбираться. Додумается сам до такого "упрощения" (я бы за такие "упрощения" руки отрывал) - сделает. Не додумается - значит ему же лучше...
TarasBer
> Ну, чего и следовало ожидать, оптимизация начинается...

Это плохо? Да, статью ту я читал. Опасная статья. Слишком модно стало размахивать ей, как библией, отрицая вообще любую оптимизацию.

> ПРОЩЕ - с div/mod...

Кто сказал? Это твоё субъективное мнение, не более. А моё субъективное мнение, что с одним div проще. А вот то, что div/mod вынудит процессор делать лишние действия, это объективная реальность.

> Пиши в маш. кодах, на кой тебе компилятор?

Ну компилятору тоже надо помогать. Зачем его путать?

> я бы за такие "упрощения" руки отрывал

А я бы - за усложнения.

Зачем делать сложно, когда логичнее, читаемее итд делать просто?
OneDose
volvo, я правильно Вас понял?


Program steny;
uses crt;
var S,S1:integer; {площадь стен, площадь рулона}
N:integer; {Необходимое количество рулонов}
D,K:real; {Стоимость рулона, общая цена}

Begin
clrscr;
writeln('Введите площадь оклеимаевой поверхности'); read(S);
writeln('Введите площадь рулона'); read(S1);
writeln('Введите цену рулона'); read(D);
if((S mod s1) <> 0) then N:=(S div S1)+1
else N:=S div S1;
writeln('Необходимо ',N,' рулонов');
K:=D*N;
writeln('Затраты на приобретение необходимого количества рулонов: ',K:8:3);
readln;
readln;
end.


Я начинающий и не знаю, можно ли назвать это линейным алгоритмом, или это алгоритм с ветвлением.
Не могли бы Вы объяснить, почему это решение будет неверно для S,S1 : real ?
Текст задачи -это все что есть, никаких вводных данных не прилагается unsure.gif

TarasBer, не могли бы вы расписать Ваш вариант в констекте написанного выше кода, я, к сожалению, не совсем понимаю что Вы имеете ввиду...

Есть вариант решения данной задачи, на который я не смею ссылаться ввиду отсутствия представления о принципах его работы( начиная с того, что я понятия не имею, откуда взялся раздел описания констант)
Спойлер (Показать/Скрыть)

Спасибо за помошь и поддержку! smile.gif
TarasBer
> Не могли бы Вы объяснить, почему это решение будет неверно для S,S1 : real ?

Для этого типа не определена операция mod.
Тогда придётся писать N := upRound(S/S1); (вот это точно самый читаемый вариант).
Функцию upRound придётся отдельно определить:

function upRound(r: real): longint;
var
res: longint;
begin
res := round®;
if res < r then inc(res);
upRound := res;
end;



> TarasBer, не могли бы вы расписать Ваш вариант в констекте написанного выше кода, я, к сожалению, не совсем понимаю что Вы имеете ввиду...

Ну просто заменяешь 2 строчки


if((S mod s1) <> 0) then N:=(S div S1)+1
else N:=S div S1;


На одну:

N := (S + S1 - 1) div S1;

OneDose
Огромное спасибо, в одну строчку - это как раз то,что нужно! good.gif
Lapp
М
Просьба обратить внимание на Правила Форума, п.1.13.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.