某人想将一张面值为100元的人民币兑换成5元,1元,和0.5元面值的纸币,但要求零钱总数为100张,且每种面值纸币至少一

问题描述:

某人想将一张面值为100元的人民币兑换成5元,1元,和0.5元面值的纸币,但要求零钱总数为100张,且每种面值纸币至少一张.
var i,j,a:integer;
begin
for i:=1 to 20 do
for j:=1 to 100 do
for a:=1 to 200 do
if (i+j+a=100) and (i*5+j*1+a*0.5=100) then writeln(i,' ',j,' ',a);
end.
解法已给出,
1个回答 分类:综合 2014-12-15

问题解答:

我来补答
没有验证你的程序,应该没有问题,如果我写的话,下面这句:
if (i+j+a=100) and (i*5+j*1+a div 2=100) then writeln(i,' ',j,' ',a);
我会修改为:
if (i+j+a=100) and (i*5+j*1+a*0.5=100) then writeln(i,' ',j,' ',a);
因为变量都是整数类型,尽量避免浮点数据类型,特别是还有相等判断.
程序是思路就是多重循环,i、j、a三个变量分别表示5元、1元、5毛的张数,分别的取值范围为1..20、1..100、1..200,使用三重循环可以完整的对每一张情况进行枚举,就是IF语句会执行40万次,每次执行的时候i、j、a的值分别在所有的可能的范围内取一次.
IF判断是否满足张数100张、金额100元,满足就输出,作为解答.
关键是要理解FOR循环,建议你运行一下下面的两个简单代码,你就知道FOR循环的功能了:
program exp1;
var i;
begin
for i:=1 to 20 do writeln('i=',i);
end.
你输入电脑运行一下,你会看见结果是下面这样的20次:
i=1
i=2
.
i=20
例子程序2:
program exp1;
var i,j;
begin
for i:=1 to 3 do
for j:=1 to 5 writeln('i=',i,',j=',j);
end.
希望你先画一下输出结果,然后上机测试一下,看看是不是下面的结果:
i=1,j=1
i=1,j=2
i=1,j=3
i=1,j=4
i=1,j=5
i=2,j=1
.
i=3,j=5
现在再回头来理解的三重循环就容易了吧.
 
 
展开全文阅读
剩余:2000