您的位置:首页 > 职场人生

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

2010-09-15 22:25 344 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐