实验名称:实验十 枚举问题(过程模拟)
实验目的:熟练掌握一些枚举问题的处理方法。
实验内容:
- 问题描述:(猴子选大王问题)有n只猴子选大王,按顺时针方向围成一个圈,猴子编号为1~n,从第1号开始报数,一直报到m的猴子退出圈外,剩下的猴子再接着从1开始报数,这样直到圈内只剩下一只猴子时,这只猴子就是大王。
输入:输入只有一行,为两个正整数n和m(n和m小于100)。
输出:输出为一个整数,为选出大王的编号。
输入样例
8 5
输出样例
3
- 问题描述:(泊松分酒问题)某人有一瓶12升的酒,同时有容积为5升和8升的空杯各一个。借助这两个空杯,如何将12升的酒平分?
一般性描述:借助于容量分别为bv和cv的两个空杯,将总容量为偶数a的酒平分,输出分酒的步骤。其中正整数bv、cv、a由键盘输入。
- 问题描述:(发扑克牌)在计算机上玩扑克牌是一种常见的游戏,现在按照玩升级的规则,模拟为4个玩家发牌,打印出每个玩家的12张牌和6张底牌。
- 问题描述:(乒乓球)国际乒联主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后从事于乒乓球研究工作,力求弄明白11分制和21分制对选手的不同影响。在开展他的研究之前,首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。华华通过以下方式进行分析,首先将比赛时每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果。如现在有这样一份记录,其中w表示华华获得一分,L表示华华对手获得一分:WWWWWWWWWWWWWWWWWWWWWWLW在11分制下,此时比赛的结果是华华第一局11:0获胜,第二局11:0获胜,正在进行第3局,当前比分为1:1。而在21分制下,此时比赛结果是华华第一局21:0获胜,正在进行第二局,比分为2:1。如果一局比赛开始,则此时比分为0:0。你的程序就是要对一系列比赛信息的输入(W和L形式)输出正确的结果。
输入:输入包含若干行字符串(每行至多为20个字母),字符串由大写的W、L和E组成。其中E表示比赛信息结束,程序应该忽略E之后的所有内容。
输出:输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中,第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。
输入样例
WWWWWWWWWWWWWWWWWWWW
WWLWE
输出样例
11:0
11:0
1:1
21:0
2:1
实验结果与分析(运行界面截图,打开需要截的图,按ALT+PrintScreen后,将光标移到下面,单击右键后选择“粘贴”):
1.
(Ⅰ)程序代码及注释
#include <stdio.h> int main(int argc, char *argv[]) { int n,m,i,p,k,w[100]; scanf("%d%d",&n,&m); for(i=0;i<n;i++) w[i]=i+1; i=0;k=1;p=0; while(p<n-1) { if(w[i]==-1) { i=(i+1)%n; continue; } if(k==m) { w[i]=-1; p++; k=0; } k++; i=(i+1)%n; } for(i=0;i<n;i++) if(w[i]!=-1) { printf("%d\n",w[i]); break; } } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
2.
(Ⅰ)程序代码及注释
#include <stdio.h> int main(int argc, char *argv[]) { int a,b,c,bv,cv,R,n; scanf("%d%d%d",&a,&bv,&cv); R=a/2; b=c=0;n=0; while(!(a==R||b==R||c==R)) { if(!b) { if(a<bv) { n=-1; break; } else { a-=bv; b=bv; } } else if(c==cv) { a+=cv; c=0; } else if(b>cv-c) { b-=cv-c; c=cv; } else { c+=b; b=0; } n++; printf("%d %d %d\n",a,b,c); } printf("%d\n",n); } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
3.
(Ⅰ)程序代码及注释
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc, char *argv[]) { int x,y,a[55],i,j,z,fg; char d[]={"xA1234567891JQK"}; srand((unsigned int)time(NULL)); for(i=0;i<54;i++) { while(1) { x=rand()%4+1; y=rand()%14; z=x*100+y; if(z==300||z==400)continue; fg=0; for(j=0;j<i;j++) if(z==a[j]){fg=1;break;} if(fg==0)break; } a[i]=z; } printf("\n%8c%8c%8c%8c",'E','S','W','N'); for(i=0;i<54;i++) { if(i%4==0)printf("\n"); if(i==48)printf("\n------\n"); if(a[i]==100||a[i]==200) printf("%8c",a[i]/100);//king else if(a[i]%100==10) printf("%6c10",a[i]/100+2);//suits&point10 else printf("%7c%c",a[i]/100+2,d[a[i]%100]);//suits&points } printf("\n"); } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析
4.
(Ⅰ)程序代码及注释
#include <stdio.h> #include <math.h> int main(int argc, char *argv[]) { int i,k,a1,a2,b1,b2; char rslt[400][2],ch; a1=a2=b1=b2=0;k=0; while(1) { ch=getchar(); if(ch=='W') { a1++;b1++; } if(ch=='L') { a2++;b2++; } if((a1>=11||a2>=11)&&(abs(a1-a2)>1)||ch=='E') { printf("%d:%d\n",a1,a2); a1=a2=0; } if((b1>=21||b2>=21)&&(abs(b1-b2)>1)||ch=='E') { rslt[k][0]=b1; rslt[k][1]=b2; k++; b1=b2=0; } if(ch=='E')break; } printf("\n"); for(i=0;i<k;i++) printf("%d:%d\n",rslt[i][0],rslt[i][1]); } |
(Ⅱ)运行结果窗口截图(窗口适当缩小)和分析