
猴子选大王 c程序设计
猴子选大王,办法如下:猴子按1,2,。。。,n编号围坐一圈,从第一只开始,按1,2,。。。,m报数,报m的退出,从下一只开始,继续循环报数,剩下的最后一只猴子就是大王,编...
猴子选大王,办法如下:猴子按1,2,。。。,n编号围坐一圈,从第一只开始,按1,2,。。。,m报数,报m的退出,从下一只开始,继续循环报数,剩下的最后一只猴子就是大王,编程输出大王的序号。
是c语言,我没学过数据结构。希望有解释说明。不要复制。
我还没学过数据结构,还不懂链表神马的。。。 展开
是c语言,我没学过数据结构。希望有解释说明。不要复制。
我还没学过数据结构,还不懂链表神马的。。。 展开
展开全部
/* 用数组做的,循环遍历数组,增加了一些注释,希望你能看懂。*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void SelectKing(int MonkeyNum, int CallNum);
void main()
{
int MonkeyNum;
int CallNum;
/* 输入猴子的个数 */
printf("Monkey Num = ");
scanf("%d", &MonkeyNum);
/* 输入M的值 */
printf("Call Num = ");
scanf("%d", &CallNum);
SelectKing(MonkeyNum, CallNum);
}
void SelectKing(int MonkeyNum, int CallNum)
{
int *Monkeys; // 申请一个数组,表示所有的猴子;
int counter = 0; //计数,当计数为猴子个数时表示选到最后一个猴子了;
int position = 0; // 位置,数组的下标,轮流遍历数组进行报数;
int token = 0; // 令牌,将报数时数到M的猴子砍掉;
// 申请猴子个数大小的数组,把桌子摆上。
Monkeys = (int *)malloc(sizeof(int)* MonkeyNum);
if (NULL == Monkeys)
{
printf("So many monkeys, system error.\n");
return;
}
// 将数组的所有内容初始化为0,被砍掉的猴子设置为1
memset(Monkeys, 0, sizeof(int)*MonkeyNum);
// 循环,直到选中大王
while(counter != MonkeyNum)
{
// 如果这个位置的猴子之前没有砍掉,那么报数有效
if (Monkeys[position] == 0)
{
token++; // 成功报数一个,令牌+1,继续报数直到等于M
// 如果报数到M,那么将这个猴子砍去
if (token == CallNum)
{
Monkeys[position] = 1; // 设置为1,表示砍去
counter++; // 计数增加
token = 0; // 设置为0,下次重新报数
// 如果是最后一个猴子,把它的位置打印,这个就是大王了
if (counter == MonkeyNum)
{
printf("The king is the %d monkey.\n", position+1);
}
}
}
// 下一个猴子报数
position = (position + 1)%MonkeyNum;
}
// 释放内存,开头为所有猴子创建的桌子
free(Monkeys);
return;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void SelectKing(int MonkeyNum, int CallNum);
void main()
{
int MonkeyNum;
int CallNum;
/* 输入猴子的个数 */
printf("Monkey Num = ");
scanf("%d", &MonkeyNum);
/* 输入M的值 */
printf("Call Num = ");
scanf("%d", &CallNum);
SelectKing(MonkeyNum, CallNum);
}
void SelectKing(int MonkeyNum, int CallNum)
{
int *Monkeys; // 申请一个数组,表示所有的猴子;
int counter = 0; //计数,当计数为猴子个数时表示选到最后一个猴子了;
int position = 0; // 位置,数组的下标,轮流遍历数组进行报数;
int token = 0; // 令牌,将报数时数到M的猴子砍掉;
// 申请猴子个数大小的数组,把桌子摆上。
Monkeys = (int *)malloc(sizeof(int)* MonkeyNum);
if (NULL == Monkeys)
{
printf("So many monkeys, system error.\n");
return;
}
// 将数组的所有内容初始化为0,被砍掉的猴子设置为1
memset(Monkeys, 0, sizeof(int)*MonkeyNum);
// 循环,直到选中大王
while(counter != MonkeyNum)
{
// 如果这个位置的猴子之前没有砍掉,那么报数有效
if (Monkeys[position] == 0)
{
token++; // 成功报数一个,令牌+1,继续报数直到等于M
// 如果报数到M,那么将这个猴子砍去
if (token == CallNum)
{
Monkeys[position] = 1; // 设置为1,表示砍去
counter++; // 计数增加
token = 0; // 设置为0,下次重新报数
// 如果是最后一个猴子,把它的位置打印,这个就是大王了
if (counter == MonkeyNum)
{
printf("The king is the %d monkey.\n", position+1);
}
}
}
// 下一个猴子报数
position = (position + 1)%MonkeyNum;
}
// 释放内存,开头为所有猴子创建的桌子
free(Monkeys);
return;
}
展开全部
这个其实网上很多,有固定的算法
就是定义一个数组,都为1,出局的变为零,如果到头了,从新在从0开始
int a,b,i,j,jishu,dawang;
int a[100]={1};
scanf("%d %d",&a,&b);
for(i=0,j=0;;)
{
jishu=0;
for(k=0;k<b;k++)
if(a[k]==1)
{
jishu++;
dawang=k+1;
}
if(jishu==1)
break;
i++; //开始去除
j++;
if(i==a)
i=0;
if(j==b)
{
j=1;
a[i]=0;
}
}
printf("da wang shi %d",dawang);
就是定义一个数组,都为1,出局的变为零,如果到头了,从新在从0开始
int a,b,i,j,jishu,dawang;
int a[100]={1};
scanf("%d %d",&a,&b);
for(i=0,j=0;;)
{
jishu=0;
for(k=0;k<b;k++)
if(a[k]==1)
{
jishu++;
dawang=k+1;
}
if(jishu==1)
break;
i++; //开始去除
j++;
if(i==a)
i=0;
if(j==b)
{
j=1;
a[i]=0;
}
}
printf("da wang shi %d",dawang);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include "stdio.h"
void main()
{
int i,m,n,k,w;
int arry[100],*p=arry;
printf("输入有多少只猴子");
scanf("%d",&m);
printf("输入几号猴子出列");
scanf("%d",&w);
for(i=0;i<m;i++) //给猴子编号
*(p+i)=i+1;
n=0;
k=0;
i=0;
while(n<m-1) //m-n大于1的时候执行
{
if(*(p+i)!=0) k++;
if(k==w) {*(p+i)=0;k=0;n++;} /* 猴子出列*/
i++;
if(i==m) i=0;
}
while(*p==0) p++;{printf("%d\n",*p);}
}
void main()
{
int i,m,n,k,w;
int arry[100],*p=arry;
printf("输入有多少只猴子");
scanf("%d",&m);
printf("输入几号猴子出列");
scanf("%d",&w);
for(i=0;i<m;i++) //给猴子编号
*(p+i)=i+1;
n=0;
k=0;
i=0;
while(n<m-1) //m-n大于1的时候执行
{
if(*(p+i)!=0) k++;
if(k==w) {*(p+i)=0;k=0;n++;} /* 猴子出列*/
i++;
if(i==m) i=0;
}
while(*p==0) p++;{printf("%d\n",*p);}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用循环链表做
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询