#include <stdio.h>
#include <malloc.h>
#defineLENsizeof(structmonkey)//定义structmonkey这个类型的长度
struct monkey
{
int num;
struct monkey *next;
};
struct monkey *create(int m)
{
struct monkey *head,*p1,*p2;
inti;
p1=p2=(struct monkey*)malloc(LEN);
head=p1;
head->num=1;
for(i=1,p1->num=1;i<m;i++)
{
p1=(struct monkey*)malloc(LEN);
p1->num=i+1;
p2->next=p1;
p2=p1;
}
p2->next=head;
return head;
}
struct monkey *findout(struct monkey *start,int n)
{
int i;
struct monkey *p;
i=n;
p=start;
for(i=1;i<n-1;i++)
p=p->next;
return p;
}
struct monkey *letout(struct monkey *last)
{
struct monkey *out,*next;
out=last->next;
last->next=out->next;
next=out->next;
free(out);
return next;
}
int main()
{
int m,n,i,king;
struct monkey *p1,*p2;
printf("请输入猴子的个数m:\n");
scanf("%d",&m);
printf("每次数猴子的个数n:\n");
scanf("%d",&n);
if(n==1)
{
king=m;
}
else
{
p1=p2=create(m);
for(i=1;i<m;i++)
{
p2=findout(p1,n);
p1=p2;
p2=letout(p1);
p1=p2;
}
king=p2->num;
free(p2);
}
printf("猴王的编号是:%d\n",king);
return 0;
}
//猴子选大王问题(约瑟夫环问题)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
intfre(ch**[],intk)
{
inti;
printf("\n猴子编号:\n");
for(i=0;mok[i]!='\0';i++)
printf("%d\t",mok[i]);//输出为踢出之前的编号,测试用
for(i=k;mok[i]!='\0';i++)
{
mok[i]=mok[i+1];
}//一个循环,将k以后的元素前移
putchar('\n');
for(i=0;mok[i]!='\0';i++)
printf("%d\t",mok[i]);//输出踢出之后的编号,测试用
printf("\n按回车继续下一轮:\n");
getch();//暂停,测试用
return0;
}
int main()
{
ch**[50];
int i;
int n,s,b;//n表示猴子总数;s表示步进;b表示元素个数及大王编号
int j,k;//j,k都是计数器
mok[0]=1;//初始化mok[0],让后面编号更简单的进行
printf("请输入猴子的总数:\n");
scanf("%d",&n);//输入猴子的总数
for(i=1;i<n;i++)
{
mok[i]=i+1;
}//对猴子进行编号
mok[n]='\0';//用0来表示数组的结尾
printf("请输入循环单位:\n");
scanf("%d",&s);//单位长度
b=n;//统计猴子的个数
for(j=1,k=0;;j++,k++)
{
if(b==1)
{
b=mok[0];
break;
}//如果元素只剩下一个,那么退出循环
if(j==s)
{
printf("\n它出列了:%d\n",mok[k]);
fre(mok,k);//用于元素前移的函数
b--;
j=1;
}//将猴子从数组中踢出,并重置计数器J。
if(mok[k+1]=='\0')
k=-1;//重置计数器k,因为后面有k++所以k要在重置基础上-1.
}//判断是否为数组最后元素,重置计数器k。
printf("\n最终大王是他:%d\n",b);
return0;
}
#include<stdio.h>
#include<malloc.h>
int main()
{
int *person,i,node,n,m;
scanf("%d%d",&n,&m);
person=(int*)malloc(sizeof(int)*(n+1));
for(i=1;i<=n;i++)//初始化圈
{
person[i]=i+1;//i表示编号为i的人,person[i]的值表示编号为i的人的下一个人的编号
}
person[n]=1;//编号为n的下一个人的编号是1
node=1;
while(node!=person[node])//如果某个人的下一个人不是自己,意味着人数超过1人
{
for(i=1;i<m-1;i++)//这个循环终止于被杀的人的前一个人
{
node=person[node];//下一个人的编号为node,node的值来自于前一个人的person[node]
}
printf("%d",person[node]);//输出被杀的人编号
person[node]=person[person[node]];//修改被杀的人的前一个人的person[node]为被杀的人的后一个人的编号
node=person[node];//这句话中的node是被杀的人后一个人
}
printf("%d",node);//输出最后幸存者的编号
return 0;
}
|