最近面试,被问到了一个约瑟夫环的问题,有空用循环数组写了一个
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;
}
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;
}
相关文章推荐
- 最近做的一道随机问题,好像是int a[]={1,2,3,4,5,6,7,8,9}; 输出一个随机数组a[]={5,8,7,9,1,4,6,2,3};
- 最近做的一个产品的架构图(面试问题:请画出你做过的最复杂的系统的架构图)
- 【最近面试遇到的一些问题】数组没有length()这个方法,有length的属性。String有有length()这个方法。
- (旋转数组问题)给定一个整数类型的循环有序数组,求循环数组的特定值,使用二分查找法(JAVA实现)
- 关于遍历向数组中添加值的问题定义一个空数组要写在循环外,否则会被覆盖
- 面试问题1:给一个无序数组,找到其中位数。
- 最近帮人解决一个循环优化的问题
- 记录最近面试时遇到的一个问题:Android root的原理
- 今天学习时突然联想到这样一个有趣但无用的问题:利用C语言(不能是其他语言)求两个整数的较大/小值-----要求不用if、三目?、switch、循环、数组、加减乘除求余、位运算符以及任何库函数
- 关于面试常见的一个数组中找出出现一次的几个数字的问题
- C/C++面试之算法系列--约瑟夫环:每隔两个循环删除数组元素,求最后删除者的下标问题
- 约瑟夫环问题(不带头结点单循环链表实现和数组实现)
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
- 最近一个刚刚毕业的朋友说,他面试时候,遇到最频繁的css问题就是垂直居中,这里给出几种垂直居中方式!
- 一个总经理的11个经典面试问题
- java__晓萌最近在做一个翻转图片的应用,你可能也知道,图片其实是由一个个的点组成的。于是,晓萌想先做一个可以翻转矩阵的程序,来解决他问题的核心部分。
- 循环排座位问题------西方的约瑟夫环
- 关于《程序员编程宝典》中编写一个函数,作用是把一个char组成的字符串循环右移n位的问题
- 转发:一个总经理的11个经典面试问题
- 最近获得的新技能,和旧知识的巩固/json,php的数组问题