今天我老师给我讲了一种新的解题方法
时间复杂度为o(kn),算是一种比较高效的方法,这种方法比
#include<stdio.h>
#define N 100
void solve(int man[],int people,int specing)
{
int count=0,out=0,now=0,pre;
while(out<people)
{
count++;
if(count%specing==0)
{
printf("%5d",now+1);
if(++out%10==0) putchar('\n');
man[pre]=man[now];//将淘汰的这个人储存的信息(下一个人的编号)给前一个人
}
pre=now;
now=man[now];//信息迭代
}
if(out%10!=0) putchar('\n');
}
void main()
{
int man[N],i,people,specing;
printf("请输入人数和报数:");
scanf("%d%d",&people,&specing);
for(i=0;i<people;i++)
man[i]=(i+1)%people;//每个人储存下一个人的编号
solve(man,people,specing);
}
首先我们假设有10个人,当数到3被淘汰
人数:0 1 2 3 4 5 6 7 8 9 用数组储存下一个人的信息
信息:1 2 3 4 5 6 7 8 9 0 当然,我们还要定义一个前一个人,实现信息的更新,
这个算法的好处就是能将已经淘汰的人排除在外,不再进行运算
比如,假设2已经被淘汰了,则2储存的信息(3)会给1
人数:0 1 3 4 5 6 7 8 9
信息:1 3 4 5 6 7 8 9 0
当5被淘汰,同理它的信息(6)给了4
人数:0 1 3 4 6 7 8 9
信息:1 3 4 6 7 8 9 0
余此类推
人数:0 1 3 4 6 7 9
信息:1 3 4 6 7 9 0
直到最后一个人被淘汰。