| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2038 人关注过本帖
标题:出圈问题(已解决)
取消只看楼主 加入收藏
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
结帖率:83.33%
收藏
 问题点数:0 回复次数:4 
出圈问题(已解决)
编号为<1, 2, 3, …, N-1, N>的共N个人依次按顺时针方向围成一个圆圈(如图). 现从第K ( ) 个人开始, 按顺时针方向依次从0到H报数, 报到H的人被从圆圈中逐出. 然后从其下一个人开始, 重新进行0到H的报数过程. 如此反复, 直到圆圈中没有人剩下为止. 试编写程序模拟上述过程, 具体要求如下:

要求:
1. 对程序中使用的主要数据结构进行简明扼要的说明 (“说明”可以用成段的文字进行表述, 也可以以注释方式在程序中进行解释; 成段的文字说明须以注释方式放置于程序的首部). (10分)
2. 编写模拟报数过程的函数 (60分), 并在程序的适当位置添加注释, 以增强程序的可读性(10分).
3. 编写主函数, 对第2步中的函数进行调用 (5分); 并分别计算在 <N=50, K=5, H=17> 和 <N=100, K=1, H=23> 时, 被从圆圈中依次逐出的人的排列顺序(需要在屏幕上显示) (每种情况5分, 共10分).
4. 编写代码, 将上一步骤中依次被逐出的人的排列顺序, 分别输出到本目录(或称文件夹)中的两个文本文件serial1.txt和serial2.txt中 (注: 相关代码可以是独立的函数, 也可以是某个函数中的某一段) (5分).

[[it] 本帖最后由 yqiong 于 2008-3-29 15:16 编辑 [/it]]
搜索更多相关主题的帖子: 圆圈 出圈 时针 注释 
2008-03-28 14:25
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
#include <iostream>
#include <stdio.h>
using namespace std;
void fun(int , int ,int );
int main()
{

    cout<<"当n=50,k=5,h=17时运行情况:";
    fun(50,5,17);
    cout<<"当n=100,k=1,h=23时运行情况:";
    fun(100,1,23);
return 0;
}

void fun(int n,int h, int k )//报数从第K个人开始,共N个人,从0开始报到H者退出
  {
        FILE *fp;
      int i,m=0,t=0,j=0;
      int *a=new int[n+1],*b=new int[n+1];
      for(i=1;i<=n;i++)
          a[i]=i;
      while(m<n)//当退出的人数不到n个时
      {
           i=k;//用i来标记a[i]
           if(a[i]!=0)
              t++;
           if(t==h)//如果报数为h者退出,即标记其为0,并计数t重新开始,退出的人数加1
          { a[i]=0;
            t=0;
            b[j++]=i;//用b[]数组把退出的顺序存起来,以便输出去文件.txt中去
             cout<<i<<endl;
            m++;
          }
          i++;
          if(i>n)i=1;//如果报数大于n,则从编号1开始
      for(i=1;i<=n;i++)
          if(a[i]!=0)  cout<<i;
      }
      if(fp=fopen("serial1.txt","w")==NULL)
        cout<<"can't open";
else{
    for(i=0;i<n;i++)
        fwrite(&b[0],2,1,fp);//把退出顺序输入到文件中
    for(i=0;i<=n;i++)
        fprintf(fp,"%d",b[i]);//读取退出顺序
     fclose(fp);
    }
}    

程序运行有误,帮忙改下!文件打形式好像有误

[[it] 本帖最后由 yqiong 于 2008-3-28 21:27 编辑 [/it]]
2008-03-28 21:00
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
谁能给个完整的程序呀,急呀,谢谢了!
2008-03-28 21:31
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
#include <stdio.h>
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int b[200];
void lastone(int n,int k ,int h);//函数声明,模拟报数
void arrayout(char *filename,int n);//函数声明,把报数时的退出顺序输出到文件中


void main()
{
    lastone(8, 1, 3);//调用函数
    arrayout("serial1.txt",50);
    lastone(100, 1, 23);
    arrayout("serial2.txt",100);
}

void arrayout(char *filename,int n)
{
    ofstream outfile(filename);
    if(!filename)//当文件不能打开时处理方法
    {
        cerr<<"can't open file."<<endl;
        exit(1);
    }
    int i;
    for(i=0;i<n;i++)//输出退出顺序
        outfile<<b[i]<<"    ";
}


void lastone(int n,int k ,int h)
{
    int a[200],i,j=0;
    for(i=1;i<=n;i++)//为n个人排序
        a[i]=i;
    int m=0,t=0;//m表示已退出的人数,t用于记数循环

    i=k;//报数从第k个人开始
    while(m<n-1)//当退出的人数不止一个时
    {
        if(a[i]!=0)//对还没退出来的人数数
            t++;
        if(t==h)//数到h时该人退出,即置其为0,t又重新开始置数,退出的人数加1,并把此时退出的人序号存入数组b,同时使i减1便于下次从0开始计数;
            {a[i]=0;t=0;b[j++]=i;m++;i=i-1;}
        i++;//向下循环记数
        if(i>n)i=1;//当数到最后一个人时,又从第一个开始重新计数
    }
for(i=1;i<=n;i++)//最后数组中只有一个没退出,即其值不为0,找到并输出
 if(a[i]!=0)
     cout<<"the lastone is:"<<i<<endl;
}

[[it] 本帖最后由 yqiong 于 2008-3-29 15:28 编辑 [/it]]
2008-03-29 15:15
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
谢谢楼上的,终于完成了!
2008-03-29 15:15
快速回复:出圈问题(已解决)
数据加载中...
 
   



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

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