最近面试,被问到了一个约瑟夫环的问题,有空用循环数组写了一个

来源:互联网 发布:网络电话软件排名 编辑:程序博客网 时间:2024/04/29 21:37

#include "stdio.h"
static int a[10] = {1,1,1,1,1,1,1,1,1,1};
static int length = 10;

void h_begin()
{
 int i = 0,flag = 0,k = 0;
 int bk = 0;
 int flag1 = flag;
  for(i = 0; (i = i%10)<10 ; ++i)
  {
   
   if(k<3 && (a[i]!=0))
   {
    k++;    
   }
   else if((k == 3) && a[i] != 0)
   {
    k = 0;
    a[i] = 0;
   
    printf("i = %d /n", i);
    flag ++;//printf("flag = %d /n",flag);
    if(flag == 10)
     break;
   }
   else if((k == 3) && a[i] == 0)
   {
    continue;
   }
  }
  return;
}
int main()
{
 h_begin();
}

从网上找到了一个,写的不错:

#include <stdio.h>
int main()
{
  
    int n;
    int n1=0; //表示报数记数器
    int p=0; //指向当前数组元素的下标
    int NumOfKing; //大王的编号
    int M,K; //M为已知猴子总数,K为报数的量级
    int a[1000];
    FILE *fp1,*fp2;
    if((fp1=fopen("monkey.in","r"))==NULL)
    {
      printf("cann't open file!/n");
      return 0;
    }
    fscanf(fp1,"%d%d",&M,&K); //从文件中读取已知数据    
    n=M; //M为圈的长度,即初始猴子数
    for(int i=0;i<n;i++)
      a[i]=1; //初试话状态数组,所有猴子都是就位的
 
    while(n>1) //n当前圈内还剩下的猴子数,控制循环在圈内只剩下一只猴子时结束循环
    {
       while(n1<K) //n1表示报数记数器,每报一次n1加1,直到报完k个数之后结束此循环
       {
         if(a[p]==1 ) //如果当前位置有猴子
         {
            n1++; //报数记数器加1
            if(n1==K)
              a[p]=0; //将第K次报数的猴子置0,表示退出圈子        
         }
         p++; //移动到下一个位置
         p=p%M; //这一步是为了解决循环数组成环遍历的目的
       }
       n1=0; //当报完K个数后将报数记数变量清0,以备下次重新报数
       n--; //当报完一轮后总猴子数减1
    }
    for(int i=0;i<M;i++) //最后遍历一遍状态数组 找到状态为1的下标i+1即为猴子大王的编号
    {
      if(a[i]==1)
      {
        NumOfKing=i+1;
        break;
      }
    } 
    fp2=fopen("monkey.out","w");
    fprintf(fp2,"%d",NumOfKing);
    fclose(fp1);
    fclose(fp2);
    return 0;
}