设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语言
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)