| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 413 人关注过本帖
标题:约瑟夫,数组。有2条语句求解释一下。
只看楼主 加入收藏
传说之狼盛
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-9-8
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
约瑟夫,数组。有2条语句求解释一下。
设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,
报数到第m个人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出
圈为止。现要求按出圈次序,每10人一组,给出这n个人的顺序表。
请考生编制函数Josegh()实现此功能并调用函数WriteDat()把结果p输出
到文件JOSE.OUT中。

 这里给出另一种算法,分析:
    设 n = 100, s = 1,m = 10。
    (1) 将1到n个人的序号存入一维数组p中;
    (2) 若第i个人报数后出圈,则将p[i]置于数组的倒数第i个位置上,而原来第i+1个至倒数第i个
元素依次向前移动一个位置;
    (3) 重复第(2)步直至圈中只剩下p[1]为止。
    注意:部分源程序存放在文件prog1.c中。

最近备考三级网络,有条C语言的题,请各位大大帮忙解释一下语句,谢谢。
#include <stdio.h>
#define N 100
#define S 1
#define M 10
int p[100], n, s, m;
void WriteDat(void);
void Josegh(void)
{
int i, j, s1, w;
s1 = s;
for (i=1; i<=n; i++)
p[i-1] = i;
for (i=n; i>=2; i--)
{
s1 = (s1+m-1)%i;
/*这里用s1=(s1+m-1)已经可以踢人出局了,为什么要加个%i求模呢???*/
if (s1 == 0)
/*求模之后,这里判断s1为0,除了s1=i之外,在什么情况下会为0呢?为什么求模为0后要将i的值赋给S1*/
s1 = i;
w = p[s1-1];
for (j=s1; j<=i-1; j++)
p[j-1] = p[j];
p[i-1] = w;
}
}
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-1; i>=0; i--)
{
printf("%4d ", p[i]);
fprintf(fp, "%4d", p[i]);
if (i%10 == 0)
{
printf("\n");
fprintf(fp, "\n");
}
}
fclose(fp);
}
搜索更多相关主题的帖子: 倒数 顺时针 分析 
2011-09-08 11:43
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:20 
环形队列实现里面也有类似的语句,为了充分利用存储空间的。可以参考一下。

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2011-09-08 18:04
快速回复:约瑟夫,数组。有2条语句求解释一下。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042552 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved