約瑟夫環問題 猴子選大王問題

qq_22543355發表於2020-09-30
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
  int n,m;
  scanf("%d %d",&n,&m);
  int *p=(int*)malloc(sizeof(int)*n);
  for(int i=0;i<n;i++)
  {p[i]=i+1;}
  int a=n-1; //從叫號  的前一個編號的下標 開始 
  for(int i=1;i<n;i++)
  {       
          int k=0; //叫號 計數
          do{a=(a+1)%n; //下標號加1 標號不能大於n
             if(p[a]!=0)k++; //猴子的編號不為0 叫號
             }while(k!=m);//叫號 滿m 退出迴圈
          printf("出圈的編號為%d\n",p[a]);
          p[a]=0;} //將出圈的猴子 編號改變為0
  for(int i=0;i<n;i++)
  {if(p[i])
  printf("輸出大王為%d",p[i]);}
  free(p);
  system("PAUSE");
  return 0;
}

執行結果:

**在這裡插入圖片描述**
若一圈猴子不是從編號為1的猴子 開始叫號
從編號為q的猴子開始 叫號

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
  int n,m,q;
  scanf("%d %d",&n,&m,&q);
  int *p=(int*)malloc(sizeof(int)*n);
  for(int i=0;i<n;i++)
  {p[i]=i+1;}
  int a=(q-2+n)%n; //叫號的猴子的前一個猴子  開始計數
  for(int i=1;i<n;i++)
  {       
          int k=0;
          do{a=(a+1)%n;
             if(p[a]!=0)k++;
             }while(k!=m);
          printf("出圈的編號為%d\n",p[a]);
          p[a]=0;}
  for(int i=0;i<n;i++)
  {if(p[i])
  printf("輸出大王為%d",p[i]);}
  free(p);
  system("PAUSE");
  return 0;
}

在這裡插入圖片描述

相關文章