算法程序设计 之 模糊数字、真假银币(1/8)

内容

模糊数字、真假银币

一、目的:

理解并掌握枚举算法的基本思想和设计步骤。

二、内容

1模糊数字

问题描述:一张单据上有一个5位数的编码,因为保管不善,其百位数已经变得模糊不清。但是知道这个5位数是57和67的倍数。现在要设计一个算法,输出所有满足这些条件的5位数,并统计这样的数的个数。

输入:每一行对应一个测试样例,每一行包含4个数字,依次是万位数、千位数、十位数和个位数。最后一行包含四个-1,表示输入结束。

输出:每组测试样例的结果输出占一行,第一个数字表示满足条件的编码个数,后面按升序输出所有满足条件的编码,数字与数字之间用空格隔开。

2 真假银币

问题描述:张三有12枚银币,其中有11枚真币和1枚假币。假币看起来和真币完全一样,但是它们的重量不一样。很遗憾的是,张三不知道假币比真币轻还是重。但他办公室有一架天平,还有一个聪明的助手。经过精心安排每次的称重,助手保证在称3次后确定发现假币。助手想跟张三开一个玩笑,只告诉他每次称重的方案和天平的状态,但是不告诉他哪个是假币,假币比真币轻还是重。请设计一个算法帮助张三辨别真假银币。

输入:第一行包含一个正整数,表示测试数据的组数。每组测试数据有三行,每行表示一次称重的结果。张三和助手事先把银币标号为A~L。每次称重的结果用3个以空格隔开的字符串表示:天平左边放置的银币标号,天平右边放置的银币标号,以及平衡状态。其中平衡状态分别用up、down和even表示,分别表示右端高、右端低和平衡。另外,每次称重天平左右的银币数总是相等的。

输出:每组测试数据的输出占一行,输出假银币的标号,并指明它比真银币轻还是重,轻则输出light,重则输出heavy。

程序代码:

1.

#include<stdio.h>

int main()

{int a1,a2,a4,a5,bai,i,pan_duan,zhi=0,ge_shu=0,x=57,y=67;

      int z,sum;

      int a[10];//因为分别存储十个数0,1,2,3,4,5,6,7,8,9

      printf("请依次输入万位,千位,十位,和个位并且输入-1-1-1-1表示停止");

      scanf("%d%d%d%d",&a5,&a4,&a2,&a1);

      while(a5!=-1)

      {    

ge_shu=0;

             for(bai=0;bai<10;bai++)

             {    

zhi=a5*10000+a4*1000+bai*100+a2*10+a1*1;

                    if((zhi%57==0)&&(zhi%67)==0)

{

                           a[ge_shu]=zhi;

                           ge_shu++;    }    

}

printf("%d",ge_shu);printf(" ");

for(i=0;i<ge_shu;i++)

{printf("%d",a[i]);}

printf("\r\n");

scanf("%d %d %d %d",&a5,&a4,&a2,&a1);

 }

 printf("所有满足57和67倍数条件的五位数有:\n ");

     z=x*y; //最小公倍数

    sum=z;

    for(;sum<10000;)

    {

      if (sum<10000){sum=z+sum;}

      }

    for (;sum<100000; sum+=z)

      {

        printf("%d\n", sum);

}

printf("停止 ");

return 0;

}

2.

#include<stdio.h>

#include<iostream>

#include<cstring>

using namespace std;

char Left[3][7];

char Right[3][7];     

char result[3][7];     

bool jie_guo(char c,bool light);     //light为真表示假设假币为轻

int main()

{

      int t;

      cin>>t;

      while(t--)

{

             for(int i=0;i<3;++i)

                    cin>>Left[i]>>Right[i]>>result[i];

             for(char c='A';c<='L';c++)

{

                    if(jie_guo(c,true)){

                           cout<<c<<"是假币并且比真币 light.\n";

                           break;

                    }

                    else if(jie_guo(c,false)){

                           cout<<c<<"是假币并且比真币 heavy.\n";

                           break;

                    }

             }

      }

      return 0;

}

bool jie_guo(char c,bool light){

      for(int i=0;i<3;i++){  //当假设假币轻时,若假币在右边则右边up,在左边则右边down

             char *pleft,*pright;  

             //当假设假币重时,若假币在右边则右边down,在左边则右边up

             if(light){

                    pleft=Left[i];

                    pright=Right[i];

             }

             else{

                    pleft=Right[i];//当假设假币重时,用指针调换天平的两侧,使得若假币在右边则右边up

                    pright=Left[i];

             }

             switch(result[i][0]){  //天平右边的情况

                    case 'u': //右边轻

                           if(strchr(pright,c)==NULL)

                                  return false;

                           break;

                    case 'e':

                           if(strchr(pleft,c)||strchr(pright,c))

                                  return false;

                           break;

                    case 'd': //右边重

                           if(strchr(pleft,c)==NULL)

                                  return false;

                           break;

             }

      }

      return true;

}

程序测试及运行结果:

1.

2.

本文链接:https://my.lmcjl.com/post/3088.html

展开阅读全文

4 评论

留下您的评论.