约瑟夫环是一个比较有趣的游戏。玩法很简单:一开始每人会有一个序号,并给出一个数字m;然后从第一个人开始报数,报到数字m的就离开队列,下一个从新开始由1开始报数;到最后一个时,第一个接着报数;以此类推,直到剩下最后一个人,就是胜利者。
在linux中,c89模式的环境中,游戏的程序实现如下:
#include <stdio.h>
#define H 12757 //如果有12757的序号,请改变H的值
int main(){
int n,m;
printf("请输入人数:");
scanf("%d",&n);
int a[n],i;
for(i=0;i<n;i++){
printf("请输入第个%d人的号码:",i+1);
scanf("%d",&a[i]);
}
printf("请输入要踢出的人的报数号码:");
scanf("%d",&m);
int *p1,*p2,*p3,s=0;
p1=&a[0];
p3=&a[0];
p2=&a[n-1];
for(i=0;i<n;i++){
if(a[i]==0){
a[i]=H;
p3++;
break;
}
}
p3=a;
for(i=0;i<n-1;i++){
s=0;
while(1){
if((*p3)!=0){
s++;
}
if(s==m){
*p3=0;
if(p3==p2){
p3=p1;
}
else{
p3++;
}
break;
}
if(p3==p2){
p3=p1;
}
else{
p3++;
}
}
}
for(i=0;i<n;i++){
if(a[i]!=0){
if(a[i]!=H){
printf("第%d个为最后存活的人,序号为%d\n",i+1,a[i]);
}
else{
a[i]=0;
printf("第%d个为最后存活的人,序号为%d\n",i+1,a[i]);
}
}
}
return 0;
}
程序中首先让你决定由几个人玩游戏,在给每一个人一个序号(序号可以无序,可以为0;但是不可以是N的值,有的话可以改变N的值就可以了。),接着程序会自动运行,选出最后一个,再输出。
实现的具体过程:
首先建立一个有n-1循环的for循环(n为人数)
然后再建立一个无限循环:其中1.判断此人是否离开,如果不是s+1(s是人报的数),再判断s是否等于m,等于就离开。然后下一个报数,如果是最后一个人,则下一个转回到第一个。
执行完for循环时就剩最后一个人,输出。
程序执行的结果是:
输入各种数据:输出的结果是:
可以看出,输出的值是正确的。
这里要注意N我定值是12757,所以序号不可以输入12757.