回 帖 发 新 帖 刷新版面

主题:求助,五色问题。

问题:
求从红黄蓝百黑五种颜色的球中,取三种颜色的球的可能取法。
我给出了如下解法:
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个回复)

沙发

我认为是枚举的方法
我的程序如下(如果有错误请指正):

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.

板凳

楼上的方法很好,我还有另一种解法,如有错误请指正.
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 楼

排列组合问题。。。

4 楼


2楼的方法很好,简单易懂。3楼的方法有些复杂,不好理解(针对我来说,毕竟我是个菜鸟![em12]有个错误,应改正为: 
  5:write(white);
  6:write(' ');
但是大家都没有对我的方法给予更正啊,我到底错在哪里了啊![em10]

5 楼

楼上的:

请注意,我用的不是枚举.

6 楼

枚举的方法很简单的
只要枚举取到和取不到两种情况就可以了
用1表示取到了
用0表示没有取到
然后题目叫取3个
只要五个数和为3就可以了
循环只要32次

7 楼

用递归可以做的
好像比赛中的这种问题就要求用递归

8 楼

你要循环32次,我只要循环(3+2+1)+(2+1)+1=10(次)。

9 楼

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 楼

楼上的,
引用:e:=d[a];f:=d[b];g:=d[c];writeln(e,' ',f,' ',g);
你直接把它改为:writeln(d[a],' ',d[b],' ',d[c]);不更方便?!
引用:这样不就行了,凡事都应该化难为易,不要舍近求远

我来回复

您尚未登录,请登录后再回复。点此登录或注册