约瑟夫问题
对十个数进行排序,按数顺序开始报数,如果出现3的倍数则淘汰,直至剩下一位。(约瑟夫问题)
(1)数组法
#include <stdio.h>
int main()
{
int a[100];
int n=10,k=3;
int i;
for(i=1;i<=n;i++) a[i]=i;
int tot=0,cnt=0;
for(i=1;tot<n;i++)
{
if(i==n+1) i=1;
if(a[i]==-1) continue;
++cnt;
if(cnt%k==0)
{
printf("%d Out!\n",i);
a[i]=-1;
++tot;
}
}
return 0;
}
(2)数据链表法。
#include <stdio.h>
#define N 1000
int a[N];
int n=10,k=3;
int main()
{
int i;
for(a[n]=1,i=1;i<n;i++) a[i]=i+1;/**构造环*/
int tot=0,cnt=0;
for(i=1;tot<n;)
{
i=a[i];
++cnt;
if(cnt%k==0)
{
int j=i;
while(a[j]!=i) j=a[j];/*找到指向i的元素*/
a[j]=a[i];/*删除i,也就是指向i的下一个*/
++tot;
printf("%d Out!\n",i);
}
}
return 0;
}