c语言报数问题

c语言报数问题,第1张

设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第个m人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,每10人一组,给出这n个人的顺序表。请考生编制函数Josegh()实现此功能并调用函数WriteDat()把结果p输出到文件OUT.DAT中。

设n=100,c=1,m=10.

(1)将1到n个人的序号存入一维数组p中;

(2)若第i个人报数后出圈,则将p[i]置于数组的倒数第i个位置上,而原来第i+1个至倒数第i个元素依次向前移动一个位置;

(3)重复第(2)步直至圈中只剩下p[1]为止。

部分源程序已给出。

请勿改动主函数main()和输出数据函数writeDat()的内容。 #include <stdio.h>

#define N 100

#define S 1

#define M 10int p[100],n,s,m

void WriteDat(void)void Josegh(void)

{}void main()

{

m=M

n=N

s=S

Josegh()

WriteDat()

}void WriteDat(void)

{

int i

FILE *fp

fp=fopen("out.dat" ," w" )

for(i=N-1i>=0i--){

printf(" %4d" ,p[i])

fprintf(fp," %4d" ,p[i])

if(i % 10==0){

printf("\n" )

fprintf(fp, "\n" )

}

}

fclose(fp)

}

/* 注:题中第一个for()循环是先对数组p赋初值。在第二个for()中用i来控制没出圈的

总人数,s1=(s1+m-1)%i的作用是找出报数后出圈人的下标,其中对i求余的作用是使报

数按圈进行(即报到尾后又从头报),该算法在很多题目中都用到。由于求余的作用当

报数正好到最后一个时s1为0,故而要进行if(s1==0)的判断。内嵌的for()循环是将出圈

以后的人依次往前移。*/

void Josegh(void)

{

int i,j,s1,w

s1=s

for(i=1i<=ni++)

p[i-1]=i

for(i=ni>=2i--)

{s1=(s1+m-1)%i<br>if(s1==0)<br>s1=i<br>w=p[s1-1]<br>for(j=s1j<ij++)<br>p[j-1]=p[j]<br>p[i-1]=w<br>}

} 这的问题和这个一样,看看吧,应该能解决了

#include<stdio.h>

int main()

{

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

out=i=n=0

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

scanf("%d",&N)

for(i=0i<Ni++) 

{

a[i]=1

}

i=0

while(out!=N-1) 

{

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

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

i++

if(i==N)i=0

}

for(i=0i<Ni++)

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

return 0

}

扩展资料:

需要说明的是:

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

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

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

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

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

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

参考资料:

百度百科-c语言


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11224626.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存