Решение, что называется, "в лоб" (далеко, очень далеко, не самое лучшее): var s,k1,k5,k10,k50,k100,k500,k1000,k10000:integer; begin write('s = '); readln(s); k1:=0; k5:=0; k10:=0; k50:=0; k100:=0; k500:=0; k1000:=0; k10000:=0; while s>=10000 do begin s:=s-10000; k10000:=k10000+1; end; while s>=1000 do begin s:=s-1000; k1000:=k1000+1; end; while s>=500 do begin s:=s-500; k500:=k500+1; end; while s>=100 do begin s:=s-100; k100:=k100+1; end; while s>=50 do begin s:=s-50; k50:=k50+1; end; while s>=10 do begin s:=s-10; k10:=k10+1; end; while s>=5 do begin s:=s-5; k5:=k5+1; end; while s>=1 do begin s:=s-1; k1:=k1+1; end; writeln('k10000=',k10000,' k1000=',k1000,' k500=',k500,' k100=',k100,' k50=',k50,' k10=',k10,' k5=',k5,' k1=',k1); writeln(' Всего купюр = ',k1+k5+k10+k50+k100+k500+k1000+k10000); end.
Пример: s = 27879 k10000=2 k1000=7 k500=1 k100=3 k50=1 k10=2 k5=1 k1=4 Всего купюр = 21
Крутить это все в уме - чистое наказание. Проще было написать программу.
// PascalABC.NET 3.2, сборка 1417 от 28.03.2017 // Внимание! Если программа не работает, обновите версию!
type Pinnacle=record St:Stack<integer>; No:integer; constructor (n:integer); begin St:=new Stack<integer>; No:=n end; end;
var MoveNo:integer;
procedure MoveDisk(s1,s2:Pinnacle); begin if s1.St.Count>0 then begin MoveNo+=1; s2.St.Push(s1.St.Pop); Writeln(MoveNo:3,': №',s2.St.Peek,' ',s1.No,' -> ',s2.No) end end;
procedure MovePinnacle(n:integer; s1,s2,s3:Pinnacle); begin if n=0 then exit; MovePinnacle(n-1,s1,s3,s2); MoveDisk(s1,s2); MovePinnacle(n-1,s3,s2,s1); end;
begin var n:=5; var p1:=new Pinnacle(1); var p2:=new Pinnacle(2); var p3:=new Pinnacle(3); Range(n,1,-1).ForEach(i->p2.St.Push(i)); MoveNo:=0; MovePinnacle(n,p2,p3,p1); end.
var s,k1,k5,k10,k50,k100,k500,k1000,k10000:integer;
begin
write('s = '); readln(s);
k1:=0; k5:=0; k10:=0; k50:=0;
k100:=0; k500:=0; k1000:=0; k10000:=0;
while s>=10000 do begin s:=s-10000; k10000:=k10000+1; end;
while s>=1000 do begin s:=s-1000; k1000:=k1000+1; end;
while s>=500 do begin s:=s-500; k500:=k500+1; end;
while s>=100 do begin s:=s-100; k100:=k100+1; end;
while s>=50 do begin s:=s-50; k50:=k50+1; end;
while s>=10 do begin s:=s-10; k10:=k10+1; end;
while s>=5 do begin s:=s-5; k5:=k5+1; end;
while s>=1 do begin s:=s-1; k1:=k1+1; end;
writeln('k10000=',k10000,' k1000=',k1000,' k500=',k500,' k100=',k100,' k50=',k50,' k10=',k10,' k5=',k5,' k1=',k1);
writeln(' Всего купюр = ',k1+k5+k10+k50+k100+k500+k1000+k10000);
end.
Пример:
s = 27879
k10000=2 k1000=7 k500=1 k100=3 k50=1 k10=2 k5=1 k1=4
Всего купюр = 21
// PascalABC.NET 3.2, сборка 1417 от 28.03.2017
// Внимание! Если программа не работает, обновите версию!
type
Pinnacle=record
St:Stack<integer>;
No:integer;
constructor (n:integer);
begin
St:=new Stack<integer>;
No:=n
end;
end;
var
MoveNo:integer;
procedure MoveDisk(s1,s2:Pinnacle);
begin
if s1.St.Count>0 then begin
MoveNo+=1;
s2.St.Push(s1.St.Pop);
Writeln(MoveNo:3,': №',s2.St.Peek,' ',s1.No,' -> ',s2.No)
end
end;
procedure MovePinnacle(n:integer; s1,s2,s3:Pinnacle);
begin
if n=0 then exit;
MovePinnacle(n-1,s1,s3,s2);
MoveDisk(s1,s2);
MovePinnacle(n-1,s3,s2,s1);
end;
begin
var n:=5;
var p1:=new Pinnacle(1);
var p2:=new Pinnacle(2);
var p3:=new Pinnacle(3);
Range(n,1,-1).ForEach(i->p2.St.Push(i));
MoveNo:=0;
MovePinnacle(n,p2,p3,p1);
end.
Результат работы
1: №1 2 -> 3
2: №2 2 -> 1
3: №1 3 -> 1
4: №3 2 -> 3
5: №1 1 -> 2
6: №2 1 -> 3
7: №1 2 -> 3
8: №4 2 -> 1
9: №1 3 -> 1
10: №2 3 -> 2
11: №1 1 -> 2
12: №3 3 -> 1
13: №1 2 -> 3
14: №2 2 -> 1
15: №1 3 -> 1
16: №5 2 -> 3
17: №1 1 -> 2
18: №2 1 -> 3
19: №1 2 -> 3
20: №3 1 -> 2
21: №1 3 -> 1
22: №2 3 -> 2
23: №1 1 -> 2
24: №4 1 -> 3
25: №1 2 -> 3
26: №2 2 -> 1
27: №1 3 -> 1
28: №3 2 -> 3
29: №1 1 -> 2
30: №2 1 -> 3
31: №1 2 -> 3
Иллюстрация первых пяти шагов приведена во вложении.