c语言猴子选大王
n只猴子选大王,选举方法如下:从头到尾1,2,3报数,凡报到3的退出,余下的从尾到头1,2,3报数,凡报3的退出,余下的又从头到尾1,2,3报数,凡报到3的退出;依此类推,当剩下两只猴子时,取这时报数报1的为王。若想当猴王,请问当初应占据什么位置?
这个是经典的约瑟夫环问题,以下程序供参考
#include <stdio.h>
int n,k,m;
int list[100]; //最多100
void houzi_fuzi()
{
int i;
do
{
printf("猴子个数n:");
scanf("%d",&n);
if (n<=0) printf("'n'error!'n'no<='0',请重新输入!
");
}
while(n<=0);
for(i=0; i<n; i++)
list[i]=i+1;
do
{
printf("第一个猴子编号k:");
scanf("%d",&k);
k--;
if (k>=n) printf("'k'error!'k'no>'n',请重新输入!
");
if (k<0) printf("'k'error!'k'no<='0',请重新输入!
");
}
while(k>=n||k<0);
do
{
printf("报数值m:");
scanf("%d",&m);
//你的可以直接赋m=3
if (m<=0) printf("'m'error!'m'no<='0',请重新输入!
");
}
while(m<=0);
}
int houzi_houwang()
{
void houzi_chuju(int m);
houzi_chuju(m);
if (n!=1) houzi_houwang();
return list[0];
}
void houzi_chuju(int m) //计算方法
{
int i;
while(n<m)
m=m-n;;
k=m+k-1;
if (k>=n) k=k-n;
printf("%d号猴子出圈
",list[k]);
for ( i=k; i<n; i++)
list[i]=list[i+1];
n--;
}
int main()
{
houzi_fuzi();
printf("%d号猴子为猴王
",houzi_houwang());
}
n里面去掉三的倍数
当初占据1的位置就可以了啊
下一篇:求一段c语言程序