| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1035 人关注过本帖
标题:求解,这个函数看不懂。。。最好逐句解释一下
只看楼主 加入收藏
skyerblue
Rank: 2
来 自:安徽
等 级:论坛游民
帖 子:24
专家分:60
注 册:2011-8-9
结帖率:83.33%
收藏
已结贴  问题点数:12 回复次数:11 
求解,这个函数看不懂。。。最好逐句解释一下
要求:设有n个人坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始从1到m报数,如此进行下去直到所有的人都出圈为止。先要求按出圈次序,每10个人为一组,给出这n个人的顺序表。请编制函数Josegh()实现此功能并调用函数WriteDat()把编号按照出圈顺序输出到文件OUT86.DAT中。
设n=100,s=1,m=10进行编程。


void Josegh(void)
{
 int i,j;               
    int 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;      
      if(s1==0)            
        s1=i;
      w=p[s1-1];            
      for(j=s1;j<=i-1;j++)   
        p[j-1]=p[j];
      p[i-1]=w;      
    }

[ 本帖最后由 skyerblue 于 2011-8-15 17:38 编辑 ]
搜索更多相关主题的帖子: 一个人 编程 顺时针 
2011-08-15 17:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
断章求义,看得懂那个是神仙。

授人以渔,不授人以鱼。
2011-08-15 17:20
tttt870226
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-8-10
收藏
得分:0 
好像看过这个题目,
2011-08-15 17:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这种游戏,是我们以前喝酒时玩的,那时叫“拍七”,挺刺激。

授人以渔,不授人以鱼。
2011-08-15 17:26
sxjdwx
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-8-15
收藏
得分:0 
以前java玩过,但是好久没玩咯都忘得差不多咯
2011-08-15 17:33
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
这不是类似约瑟夫环的题目么,呵呵。我们以前做的时候是建一个循环链表,然后依次出序列。楼主给的代码中我有几个变量不太清楚,麻烦把全部代码发一下。

[ 本帖最后由 QQ346957135 于 2011-8-15 19:04 编辑 ]

A real warrior never quits.
2011-08-15 18:58
leaf_yyl
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:19
专家分:104
注 册:2011-8-13
收藏
得分:10 
void Josegh(void)
{
int i,j;               
    int s1,w;            
    s1=s;                  //s是开始循环的第一个人的序号,因为函数参数是VOID,因此偶只好认为S,M,N都是全局变量
    for(i=1;i<=n;i++)      //此循环为给n个人编号
      p[i-1]=i;
    for(i=n;i>=2;i--)      //i代表剩下的人数
    {
      s1=(s1+m-1)%i;       //从第一个人开始数数
      if(s1==0)             //s1=0表示数到最后一个人,因此令s1=i。(i从n依次递减)
        s1=i;
      w=p[s1-1];            //w记录每一圈数到m的人
      for(j=s1;j<=i-1;j++)   //此循环把w之后的数组成员依次向前移动一位
        p[j-1]=p[j];
      p[i-1]=w;       //w被记录到数组最后一位,最后逆序输出数组即可得到出列队列
    }
ps:这个题目有及其简单的代码的

[ 本帖最后由 leaf_yyl 于 2011-8-15 19:58 编辑 ]
2011-08-15 19:56
skyerblue
Rank: 2
来 自:安徽
等 级:论坛游民
帖 子:24
专家分:60
注 册:2011-8-9
收藏
得分:0 
回复 6楼 QQ346957135
设有n个人坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始从1到m报数,如此进行下去直到所有的人都出圈为止。先要求按出圈次序,每10个人为一组,给出这n个人的顺序表。请编制函数Josegh()实现此功能并调用函数WriteDat()把编号按照出圈顺序输出到文件OUT86.DAT中。
设n=100,s=1,m=10进行编程。
注意:部分源程序已给出。
请勿改动主函数main()和写函数WriteDat()的内容。
试题程序:
#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;               
    int 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;      
      if(s1==0)            
        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("OUT86.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-08-15 20:47
skyerblue
Rank: 2
来 自:安徽
等 级:论坛游民
帖 子:24
专家分:60
注 册:2011-8-9
收藏
得分:0 
回复 7楼 leaf_yyl
简单的代码能发给我看下么?
2011-08-15 20:53
leaf_yyl
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:19
专家分:104
注 册:2011-8-13
收藏
得分:0 
void josegh(short s,short m,short n)            //我写的麻烦了,不过整体思路是一样的
{                                                //利用数组下标代替人员编号,用值代表圆圈中得下一位
    short *p;                                     //把数到m的人踢出循环队列
    short i,j;                                     //优点是不用对数组进行循环移动赋值
    p=(short*)malloc(n*sizeof(short));
    for (i=0;i<n-1;i++)        //p【i】中的值代表他的下一位id,一开始前n-1人都是n+1,第n人时0;
        p[i]=i+1;
    p[i]=0;
    i=s-1;
    while(p[i]!=i)                        //p[i]==i则表示圈中只剩一个人
    {
        for (j=0;j<m-2;j++)                //m-2是因为只数m-1人,好把第m人t出队列
        {
            i=p[i];
        }
        cout<<(p[i]+1)<<endl;                //顺序输出出列人员编号
        p[i]=p[p[i]];                        //把出列人员t出循环
        i=p[i];                               //把指针指向下一轮数数的开始人员
    }
}

[ 本帖最后由 leaf_yyl 于 2011-8-15 21:33 编辑 ]
2011-08-15 21:29
快速回复:求解,这个函数看不懂。。。最好逐句解释一下
数据加载中...
 
   



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

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