约瑟夫问题

对十个数进行排序,按数顺序开始报数,如果出现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;

}

posted @ 2017-08-16 21:23  我大概是只废喵  阅读(109)  评论(0编辑  收藏  举报