主题:求助,五色问题。
lierenpascal
[专家分:0] 发布于 2007-07-01 17:32:00
问题:
求从红黄蓝百黑五种颜色的球中,取三种颜色的球的可能取法。
我给出了如下解法:
program Fse;
type
color=(red,yellow,blue,white,black);
var
x,y,z,pri:color;
loop,total:integer;
begin
total:=0;
for x:=red to black do
for y:=red to black do
if(x<>y)then
for z:=red to black do
if (z<>x)and(z<>y)then
begin
total:=total+1;
write(total:5);
for loop:=1 to 3 do
begin
case loop of
1:pri:=x;
2:pri:=y;
3:pri:=z;
end;
case pri of
red:write('red');
yellow:write('yellow');
blue:write('blue');
white:write('white');
black:write('black');
end
end;
writeln
end;
writeln('total number:',total);
readln
end.
求高手找出毛病,并改正。加30分~
回复列表 (共11个回复)
沙发
bigchen [专家分:1940] 发布于 2007-07-01 19:42:00
我认为是枚举的方法
我的程序如下(如果有错误请指正):
var
red,yellow,white,black,blue,total:integer;
begin
for red:=0 to 1 do
for yellow:=0 to 1 do
for white:=0 to 1 do
for black:=0 to 1 do
for blue:=0 to 1 do
if red+yellow+white+black+blue=3 then
begin
if red=1 then write('red');
if yellow=1 then write('yellow');
if white=1 then write('white');
if black=1 then write('black');
if blue=1 then write('blue');
writeln;inc(total);
end;
writeln(total);
end.
板凳
Matodied [专家分:7560] 发布于 2007-07-01 20:27:00
楼上的方法很好,我还有另一种解法,如有错误请指正.
PROCEDURE pri(s: INTEGER);
BEGIN
CASE s OF
1: WRITE('red');
2: WRITE('yellow');
3: WRITE('blue');
4: WRITE('black');
5: WRITE('white');
WRITE(' ');
END;
END;
VAR
c1, c2, c3, total: INTEGER;
BEGIN
FOR c1:=1 TO 3 DO BEGIN
FOR c2:=c1 + 1 TO 4 DO BEGIN
FOR c3:=c2 + 1 TO 5 DO BEGIN
pri(c1);
pri(c2);
pri(c3);
WRITELN;
total := total + 1;
END;
END;
END;
WRITELN('total=',total);
END.
3 楼
游侠UFO [专家分:1200] 发布于 2007-07-01 21:59:00
排列组合问题。。。
4 楼
lierenpascal [专家分:0] 发布于 2007-07-02 09:28:00
2楼的方法很好,简单易懂。3楼的方法有些复杂,不好理解(针对我来说,毕竟我是个菜鸟![em12]有个错误,应改正为:
5:write(white);
6:write(' ');
但是大家都没有对我的方法给予更正啊,我到底错在哪里了啊![em10]
5 楼
Matodied [专家分:7560] 发布于 2007-07-02 11:02:00
楼上的:
请注意,我用的不是枚举.
6 楼
bigchen [专家分:1940] 发布于 2007-07-02 12:26:00
枚举的方法很简单的
只要枚举取到和取不到两种情况就可以了
用1表示取到了
用0表示没有取到
然后题目叫取3个
只要五个数和为3就可以了
循环只要32次
7 楼
dorremon1992 [专家分:870] 发布于 2007-07-04 16:56:00
用递归可以做的
好像比赛中的这种问题就要求用递归
8 楼
Matodied [专家分:7560] 发布于 2007-07-04 20:47:00
你要循环32次,我只要循环(3+2+1)+(2+1)+1=10(次)。
9 楼
007bond [专家分:540] 发布于 2007-07-16 08:31:00
var a,b,c:integer;d:array[1..5] of string;
e,f,g:string;
begin
d[1]:='red';d[2]:='yellow';d[3]:='blue';d[4]:='black';d[5]:='white';
for a:=1 to 3 do
for b:=a+1 to 4 do
for c:=b+1 to 5 do
begin
e:=d[a];f:=d[b];g:=d[c];writeln(e,' ',f,' ',g);
END;
end.
这样不就行了,凡事都应该化难为易,不要舍近求远
10 楼
abcwuhang [专家分:1840] 发布于 2007-07-16 17:12:00
楼上的,
引用:e:=d[a];f:=d[b];g:=d[c];writeln(e,' ',f,' ',g);
你直接把它改为:writeln(d[a],' ',d[b],' ',d[c]);不更方便?!
引用:这样不就行了,凡事都应该化难为易,不要舍近求远
我来回复