信息的数字化

一、警察抓小偷问题

1.问题描述

警察局抓了a,b,c,d四名偷窃嫌疑犯,其中只有一人是小偷。审问中
a说:“我不是小偷。”
b说:“c是小偷。”
c说:“小偷肯定是d。”
d说:“c在冤枉人。”
现在已经知道四个人中三人说的是真话,一人说的是假话,问到底谁是小偷?

2.思路分析

将a,b,c,d将四个人进行编号,号码分别为1,2,3,4。则问题可用枚举尝试法来解决。
用变量x存放小偷的编号,则x的取值范围从1取到4,就假设了他们中的某人是小偷的所有情况。四个人所说的话就可以分别写成:
a说的话:x<>1
b说的话:x=3
c说的话:x=4
d说的话:x<>4
在x的枚举过程中,当这四个逻辑式的值相加等于3时,即表示“四个人中三人说的是真话,一人说的是假话”。

3.伪码描述

main( )
{ 
    int x;
  	for(x=1;x<=4;x++)
    if((x<>1)+(x=3)+(x=4)+(x<>4)==3)
        print(chr(64+x),“is a thief .);
 }

运行结果:
c is a thief .

二、竞赛名次预测问题

1.问题描述

三位老师对某次数学竞赛进行了预测。他们的预测如下:
甲说:学生A得第一名,学生B得第三名。
乙说:学生C得第一名,学生D得第四名。
丙说:学生D得第二名,学生A得第三名。
竞赛结果表明,他们都说对了一半,说错了一半,并且无并列名次,试编程输出A、B、C、D各自的名次。

2.思路分析

用数1,2,3,4分别代表学生a,b,c,d获得的名次。问题就可以利用三重循环把所有的情况枚举出来。
1)用a,b,c,d 代表四个同学,其存储的值代表他们的名次。
设置第一层计数循环a的范围从1到4;
设置第二层计数循环b的范围从1到4;
设置内计数循环c的范围从1到来4;
由于无并列名次,名次的和为1+2+3+4=10,由此可计算出d的名次值为10-a-b-c。
2)问题的已知内容,可以表示成以下几个条件式:
(1)(a=1)+(b=3)=1
(2) (c=1)+(d=4)=1
(3) (d=2)+(a=3)=1
若三个条件均满足,则输出结果,若不满足,继续循环搜索,直至循环正常结束。

3.伪码描述

main( )
{  
    int a,b,c,d;
    for( a=1;a<=4;a=a+1)
       for( b=1;b<=4;b=b+1)
           if (a<>b)
               for( c=1;c<=4;c=c+1)
                   if (c<>a and c<>b)
                     {    d=10-a-b-c;
                        if  (d<>a   and  d<>b   and  d<>c )
                            if(((a=1)+(b=3))=1 and ((c=1)+(d=4))=1 and ((d=2)+(a=3))=1)  
                                 print( “a,b,c,d=,a,b,c,d);
                     }
  }

三、填写运算符

1.问题描述

输入任意5个数x1,x2,x3,x4,x5每相邻两个数之间填上一
个运算符。在填入四个运算符后,使得表达式值为一个指
定值y(y由键盘输入)。求出所有满足条件的表达式。

2.思路分析

(1)枚举尝试法解题:先填4个“+”。检验条件表达式x1+x2+x3+x4+x5=y.如果不成立,则将第四个运算符改为“一”,以后改“”、改“/”。轮完一遍,把第三个运算符改为“一”,第四个运算符按“十、一、、/”顺序再轮一遍… 如此下去,直至第一一个运算符,由“十”至“/”轮完为止。
每两个相邻数之间4个运算符均按“+、一、、/”尝试- -遍,则要组织四重循环。
(2)若当前运算符是“/”,则注意考虑运算符右端的数必须非零,因为零不可以作为除数。
(3)现在接着考虑“十、一、
、/"应如何表示,才能方便算法对表达式的求值?
为了便于循环,在算法中,把“+、一、*、/”数字化作1,2,3,4。5个数据间需4个运算符,这次不用4个普通变量,而是用一个有4个元素数组1]-[4]4来代表它们,道理在算法说明中解释。例如i[3]=4表示第三个运算符为“/”。
(4)在运算时保证“先乘除/后加减”的优先顺序。

3.伪码描述

main( )
{
    int j,k, f, i[5], total;
    float n[6],p,q;
    char c[5]= [",'+','-','* ','/'];
    print(" input five number" );
    for(j=1; j<=5; j=j+ 1)
        input(n[j]);
    print(" input result: ") ;
    input(n[0]);
    total = 0;
    for(i[1]=1; i[1]<=4; i[1]=i[1]+1)
        if ((i[1]<4) or (n[2]<>0))
            for (1[2]=1; i[2]<=4; i[2]=i[2]+ 1)
                if((i[2]<4) or (n[3]<> 0))
                    for (i[3]=1; i[3]<=4; i[3]= i[3]+1)
                        if ((i[3]<4) or (n[4]<>0))
                            for (i[4]=l; i[4]<=4; i[4]=i[4]+ 1)
                                 if((i[4]<4) or (n[5]<>0))
                                  {
                                     p=O; q=n[1]; f= 1;
                                    for (k=1; k<=4; k=k+ 1)
                                        switch (i[k])
                                         {
                                              case 1: p=p+f*q; f=1; q=n[k+ 1]; break;
                                              case 2: p=p+f*q; f=-1; q=n[k+ 1]; break;
                                              case 3: q=q* n[k+ 1]; break;
                                              case 4: q=q/n[k+ 1]; 
                                          }
                                        if (p+f*q= n[0])
                                        {
                                            total= total + 1;
                                            print ("total",total,": ");
                                            for (k=1; k<=4; k=k+ 1)
                                                print (n[k],c[i[k]]);
                                            print (n[5],"=",n[0]);
                                        }
                                 }
                                 if (total=0)
                                     print("Non solution");
}

四、产品正次品的判断问题

1.问题描述

有10箱产品每箱有1000件,正品每件100克。其中的几箱是次品,次品每件比正品轻10克,问能否用秤只称一次,就找出哪几箱是次品。

2.思路分析

先将箱子编码1,2,3,4……10。用枚举方法分析问题,由小到大讨论:
从“1”号箱取1件产品,若最后总重量比标准重量轻10克,则1号箱为次品;
从“2”号箱取2件产品,若最后总重量比标准重量轻20克,则2号箱为次品;
从“3”号箱若取3件产品,若最后总重量比标准重量轻30克,无法识别哪些箱是次品。但从3号箱取4件产品,若最后总重量比标准重量轻40克,肯定3号箱为次品;
再看“4”号箱,
①取5件产品,若最后总重量比标准重量轻50克,无法识 别哪些是次品:可能是1、3号箱(分别取1件、4件)或5号箱为次品。
② 取6件产品,若最后总重量比标准重量轻60克,无法识别哪些是次品:可能是2、3号箱(分别取2件、4件)或5号箱为次品。
③ 取7件产品,若最后总重量比标准重量轻70克,也无法识别哪些是次品:可能是1、2、3号箱(分别取1件、2件、4件)或5号箱为次品。
④ 取8件产品,则最后总重量比标准重量轻80克,则可以肯定4号箱为次品;无需继续枚举就可看出:1,2,3,4……10号箱取产品的件数分别为20,21,22,23,24,25,26,27,28,29,即1,2,4,8,16,32,64,128,256,512件。
根据以上方法,取出产品称量后:
轻10克1号箱为次品。
轻20克2号箱为次品。
轻30克1、2号箱为次品。
轻40克3号箱为次品。
轻50克1、3号箱为次品。
轻60克2、3号箱为次品。
轻70克1、2、3号箱为次品。
轻80克4号箱为次品。
轻90克1、4号箱为次品。

3.伪码描述

main( )
{ int i,k,n,w1=0,w2=0,t;
  print(“Input  the number of boxes:)input(n);
  t=1;
  for (i=1;i<=n;i++)
   {print(i,“box take” , t,” units.);
  w1=w1+t;t=t*2;}
  w1=w1*100;
  print(“normal weight  ”,w1);
  print(“ Input reality weight”);
  input(w2);
  w1=(w1-w2)/10;
  while(w1<>0)
  { 
   k=0;
   t=1;
   while( w1-t>=0)
   { 
       t=t*2; 
       k=k+1;
   } 
   print(k,“is bad”);
   w1=w1-t/2;
  }
}

五、判断一个整数能否被三个数整除的问题

1.问题描述

编写算法对输入的一个整数,判断它能否被3,5,7整除,并输出以下信息之一:
(1) 能同时被3,5,7整除;
(2) 能被其中两数(要指出哪两个)整除;
(3) 能被其中一个数(要指出哪一个)整除;
(4) 不能被3,5,7任一个整除。

2.伪码描述

main( )
{
    long  n;
    int k;
    print(“ Please  enter  a  number:);
    input(n);
    k=(n mod 3=0+(n mod 5=0*2+(n mod 7=0*4
   switch (k)
   {  case  7:  print(“  All”); break;
      case  6:  print(5  and  7); break;
      case  5:  print(3  and  7); break;
      case  4:  print(7); break;
      case  3:  print(3  and  5); break;
      case  2:  print(5); break;
      case  1:  print(3); break;
      case  0:  print(“ none“); break;
   }
发布了28 篇原创文章 · 获赞 13 · 访问量 445

猜你喜欢

转载自blog.csdn.net/yo_u_niverse/article/details/105574366