#include <stdio.h>
//此为全局数组,为了省事这么设的,c中不建议使用这种全局变量,不安全
//数组大小设为50也是为了省事,最多只能是50个人
int a[50];
//这个函数即为找出最后剩下的人,n为人数,m为第一个数的号码
int fun(int n,int m)
{
//num指示有几个数到5的人
//j为新的下标,k是计数变量,tem是临时保存m变量的值
int num=0,j=0,k,tem=m;
if(n==1) return a[0];//当最后剩下1个人时,返回是第几个人,此人已经保存到a[0]中
//从第一个数的号码开始往后判断
for(k=m;k<(n+tem);k++)
{
if((k+1)%5==0)//当数5时
{
num++;//数5的人加1
//再从1开始数
//(这里要说一下,C中都是从0计数的,这里默认C中的0相当于现实的1)
//学编程的这个应该理解的吧
m=0;
continue;//直接结束本次循环
}
a[j++]=a[k-tem];//把没数5的人存到数组中
m++;//这里也是下个人应该数的数
}
n=n-num;//把数过5的人减去,即为本次数一圈后剩余的人
return fun(n,m);//递归调用函数
}
int main(int argc, char* argv[])
{
//这个不用解释了吧
int people,i,end;
printf("请输入人数:");
scanf("%d",&people);
for(i=0;i<people;i++)
{
a[i]=i+1;
}
//调用函数,用end保存返回的值
end=fun(people,0);
printf("最后剩下的人的编号为:%3d\n",end);
//printf("Hello World!\n");
return 0;
}
用递归实现这个有点大材小用了,并且容易出错,还有就是递归的效率会比较低。当然为了练习递归的话就另说了。
本来昨天就要发的,结果全校性停电……