当前位置:首页 > 教育综合 > 正文

有 n 位小朋友排成一排,从左到右编号为 1-n。

数据结构编程:求解报数问题。设有n个人占成一排,从左向右的编号分别为1到n,现在从左往右报数“1,2

publicclass约瑟夫问题{
publicstaticvoidmain(String[]args){
约瑟夫(100,2);
}
/**
*求解总人数n,数到第d个人出圈的约瑟夫问题。按顺序打印出圈人。
*
*@paramn
*总人数。
*@paramd
*数到第几个人出圈。
*/
publicstaticvoid约瑟夫(intn,intd){
boolean[]a=newboolean[n];
intstart=0;
while(圈里是否还有人(a)){
start=出圈(start,d,a);
}
}
privatestaticint出圈(intstart,intn,boolean[]a){
inti=start;
while(n>0){
while(a[i]){
i=(i+1)%a.length;
}
i=(i+1)%a.length;
n--;
}
i=(i+a.length-1)%a.length;
a[i]=true;
System.out.printf("%4d",i+1);
returni;
}
privatestaticboolean圈里是否还有人(boolean[]a){
for(inti=0;iif(!a[i])
returntrue;
}
returnfalse;
}
}

有N个小朋友,分别编号为1到N,他们按编号围成一个圆圈,从1开始报数,当报到3的小朋友出列,

static void LastLeaver(int nums, int count) { int[] num = new int[nums]; for (int index = 0; index< num.Length; index++) { num[index] =index + 1;//从1-nums给每个人编号 } int m = 0; //m为退出人数 int i = 0;//i为每次循环时的计数变量 int k = 0;//k为按1,2,3count报数时的计数变量 while (m < nums - 1) { if (num[i] != 0) { k++; } if (k ==

C语言:有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数。

#include

int main()

{

int i,n,N,out,a[1000];

out=i=n=0;

printf("输入约瑟夫圈大小\n100\n");

scanf("%d",&N);

for(i=0;i

{

a[i]=1;

}

i=0;

while(out!=N-1)         

{

if(a[i]==1)n++;

if(n==3){a[i]=0;n=0;out++;}

i++;

if(i==N)i=0;

}

for(i=0;i

if(a[i]==1)printf("最后剩下的是第%d个人",i+1);break;

return 0;

}

扩展资料:

需要说明的是:

1、一个C语言源程序可以由一个或多个源文件组成。

2、每个源文件可由一个或多个函数组成。

3、一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。是整个程序的入口。

4、源程序中可以有预处理命令(包括include 命令,ifdef、ifndef命令、define命令),预处理命令通常应放在源文件或源程序的最前面。

5、每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。结构体、联合体、枚举型的声明的“}”后要加“ ;”。

6、标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。

参考资料:

百度百科-c语言

n个人围成一圈,序号分别为1-n,从1号玩家从1开始报数. 如果有玩家报的数是3的倍数或者

此题可用数学方法求解。



设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数 (用数学方法解的时候需要注意应当从0开始编号,因为取余会取到0解。)



实质是一个递推,n个人中最终留下来的序号与n-1个人中留下来的人的序号有一个递推关系式。

找规律的方法:

1、标出序列号:找规律的题目,通常按照一定的顺序给出一系列量,要求我们根据这些已知的量找出一般规律。找出的规律,通常包序列号。所以,把变量和序列号放在一起加以比较,就比较容易发现其中的奥秘。

2、斐波那契数列法:每个数都是前两个数的和。

3、等差数列法:每两个数之间的差都相等。

4、跳格子法:可以间隔着看,看隔着的数之间有什么关系,如14,1,12,3,10,5,第奇数项成等差数列,第偶数项也成等差数列,于是接下来应该填8。

C语言:n个编号为1~n的人围坐一圈,从1号开始正向报数到m者退出,从下一人继续;求出列序列,咋编程?

代码文本:

#include "stdio.h"

int main(int argc,char *argv[]){

int a[20],b[20],i,j,t,n,m;

printf("Enter n(int 00 && n<21 && m>0 && m<21){

for(i=0;i

i=-1,j=t=0;

printf("\nThe result is:\n");

while(t

if(a[++i%=n] && (++j%=m)==0){

printf("%d ",b[t++]=a[i]);//生成并输出序列

a[i]=0;

}

putchar('\n');

}

else

puts("ERROR");

return 0;

}

供参考……

展开全文阅读