Помощь - Поиск - Пользователи - Календарь
Полная версия: Выяснить если число можно представить как суму из чисел 5 и 3.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
DarkWishmaster
Привет.
Задача: выяснить если число может быть записано как сума из чисел 5 и 3.
Например 11=5+3+3 или 16=5+5+3+3.
У меня получилось если только в суме все числа 3 и одна 5 или наоборот например 11 или 23 но если 16=5+5+3+3 то тут тупик.
Может у вас есть идеи, спасибо заранее.
volvo
Может и есть... Если 5*X + 3*Y = S, то X = (S - 3*Y) / 5, где X - число пятерок, Y - число троек.

Вот и сделай цикл по Y от 0 и пока (S - 3*Y) >= 0. Если X - целое число, то ты нашел разложение суммы, если нет - проверяй следующий Y...
DarkWishmaster
Цитата(volvo @ 23.01.2011 17:16) *

Может и есть... Если 5*X + 3*Y = S, то X = (S - 3*Y) / 5, где X - число пятерок, Y - число троек.

Вот и сделай цикл по Y от 0 и пока (S - 3*Y) >= 0. Если X - целое число, то ты нашел разложение суммы, если нет - проверяй следующий Y...



║Program P1; uses crt;
║var x:real; p:boolean; y,s:integer;
║begin clrscr;
║ readln(s);
║ P:=false;
║ y:=0; x:=0;
║ while p=false do begin
║ x:=(s-(3*y))/5;
║ if x=round(x) then P:=true
║ else y:=y+1;
║ end;
║ writeln(P);
║ readln; readln;
║ end.
на все числа TRUE;
volvo
Я не это предлагал.
  while S - 3*y >= 0 do
begin
if (S - 3*y) mod 5 = 0 then
begin
writeln(S, ' = ', (S - 3*y) div 5, '*5 + ', Y, '*3');
exit;
end
else inc(y);
end;

прекрасно выдает ответ. Оптимизируешь сам...
DarkWishmaster
Цитата(volvo @ 23.01.2011 17:38) *

Я не это предлагал.
  while S - 3*y >= 0 do
begin
if (S - 3*y) mod 5 = 0 then
begin
writeln(S, ' = ', (S - 3*y) div 5, '*5 + ', Y, '*3');
exit;
end
else inc(y);
end;

прекрасно выдает ответ. Оптимизируешь сам...


Спасибо большое! Только вот из за exit; он выходит из цикла и ничего не выдает на экран.
мисс_граффити
так надо разложить или просто написать, возможно/невозможно?
разложений же может быть несколько. тогда - какое из них выводить?
volvo
Цитата
Только вот из за exit; он выходит из цикла и ничего не выдает на экран.
Только вот ПЕРЕД Exit он выдает найденное разложение. Если совсем ничего не написал - значит, не нашел.
DarkWishmaster
Цитата(мисс_граффити @ 24.01.2011 10:14) *

так надо разложить или просто написать, возможно/невозможно?
разложений же может быть несколько. тогда - какое из них выводить?


Надо просто написать если это возможно, но принцип тот же.

Так в тот то и дело что число можно разложить, и если удалить exit то выводит разложение только в бесконечном цикле.
Он будет показывать только если удалить clrscr и заново ctrl+f9
-Volvo-
Цитата
Так в тот то и дело что число можно разложить, и если удалить exit то выводит разложение только в бесконечном цикле.
Он будет показывать только если удалить clrscr и заново ctrl+f9
Фантастика - на другом форуме. У меня, значит, работает, а у тебя - нет? Значит, показывай полный код, что ты там накрутил...
DarkWishmaster
Цитата(-Volvo- @ 25.01.2011 1:06) *

Фантастика - на другом форуме. У меня, значит, работает, а у тебя - нет? Значит, показывай полный код, что ты там накрутил...


║Program P1; uses crt;
║ var s,x,y,m:integer;
║ begin clrscr;
║ read(S);
║ while M>=0 do
║ begin
║ M:=S-3*y;
║ if M mod 5=0 then
║ begin
║ writeln(S,'=',M div 5,'*5+',Y,'*3');
║ exit;
║ end
║ else inc(y);
║ end;
║ readln;
║ end.

С оператором clrscr; о ничего не выводит на экран, без него он выходит из цикла, и потом снова ctrl+f9 и видешь результат
volvo
Ты б читал число через ReadLn - проблемы б не было. А то число прочиталось, Enter остался в буфере клавиатуры. Потом ты делаешь вроде бы паузу. через ReadLn, ан нет - всего навсего прочитается то, что осталось в буфере. Так что, учи матчасть...
DarkWishmaster
Цитата(volvo @ 25.01.2011 15:46) *

Ты б читал число через ReadLn - проблемы б не было. А то число прочиталось, Enter остался в буфере клавиатуры. Потом ты делаешь вроде бы паузу. через ReadLn, ан нет - всего навсего прочитается то, что осталось в буфере. Так что, учи матчасть...

с ReadLN тот же эфект.
Krjuger
Молодой человек,у вас какое условие входа и выполнения в цикле?
Цитата
while M>=0 do

А извините где вы инициализировали само значение М?Уже в самом цикле......Либо сделайте инициализацию раньше, а потом меняйте в цикле,либо верните то,как было у Volvo,потому что то, что написал он и то ,что вы не равнозначно.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.