一道简单的Pascal语言题目(中学)(1)

来源:百度知道 编辑:UC知道 时间:2024/09/21 04:32:51
人民币找零(rmb.pas rmb.in rmb.out)
在50元和100元面值的人民币出现之前,人民币仅由10元、5元、2元、1元、5角、2角、1角和5分、2分、1分面值的钱币组成。现给定一个10000元以内,精确到1分的人民币数值,请你用最少的钱币张数,找出相应的钱数。
样例:
rmb,in
17.32 {给定钱币数为17元3角2分}
rmb.out
6 {钱币总张数,此数应最小}
10 1
5 1 {以下每行两个数,两数之间一个空格,第一个数是面值,第二个数是张数,按
2 1 面值由大到小排列}
0.2 1
0.1 1
0.02 1

说一下我的思想,从10元开始试,分别枚举每一个面值直到没钱(从大到小枚举)一旦总钱数包括这个面值,就尽量多的用这个面值来“换开”总钱数,余下的留给后面枚举,可以证明一定能够找出来(有一分的)而且可以证明一定是最优解
const rmb:array[1..10]of integer=(1000,500,200,100,50,20,10,5,2,1);//先把面值存进数组里,便于后面使用
var b:real;a,tot:longint;i:integer;ans:array[1..10]of longint;
begin
readln(b);
a:=trunc(b*100);//转换成以分为单位的钱数,便于计算
for i:=1 to 10 do//从10元开始枚举
begin
if a>rmb[i] then begin//一旦能够“换开”
inc(ans[i],a div rmb[i]);//记下来用了多少张
inc(tot,a div rmb[i]);//同上
dec(a,a div rmb[i]*rmb[i]);//总钱数里减去“换开”的面值
end;
if a=0 then break;//一旦全部换开了就不用在试了
end;
writeln(tot);//接下来就是输出了
for i:=1 to 10 do
writeln(rmb[i]/100:0:2,ans[i]);
end.

中学的,真强啊,

我们在大学才接触到计算机呀!

这个是一个算法思路!
从大到小的分法。
X div 10
再(X MOD 10)DIV 5
再(X MOD 5)DIV 2

以此类推!

楼下的太弱了吧,我才