标题:出圈问题(已解决)
只看楼主
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
结帖率:83.33%
 问题点数:0 回复次数:9 
出圈问题(已解决)
编号为<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
新手上路了
Rank: 1
等 级:新手上路
威 望:2
帖 子:107
专家分:0
注 册:2008-3-27
得分:0 
int person[m]="初始化"
int *p,*q[m];                //q数组是用来标记已出局的人
p=person[k];                 //p指向数组的第K个位置
int n=0;
int check=0;
while(n<m)
{    
    if(p==q)            //如果被标记过了p直接前进
        p++;
    if(*p!=null&&p!=q)                
        check++;
    if(check==h)            //如果check满足走了h个单位输出
    {
        printf("%d",*p);
        q[n]=p;
        n++;
        p++;
        check=0;
    }
    if(*p==null)
        p=person;        //重新回到数组头
}
//写的有点麻烦,哪位朋友有更简单点的办法发上来指正下
2008-03-28 17:57
新手上路了
Rank: 1
等 级:新手上路
威 望:2
帖 子:107
专家分:0
注 册:2008-3-27
得分:0 
应该这样:
int person[m]="初始化"
int *p,*q[m];                //q数组是用来标记已出局的人
p=person[k];                 //p指向数组的第K个位置
int n=0;                
int check=0;
while(n<m)                //若所有数都被找到,那么终止循环
{    
    if(check==h)            //如果check满足走了h个单位输出
    {
        printf("%d",*p);
        q[n]=p;            
        n++;
        p++;
        check=0;
    }
    if(p==q)            //如果被标记过了p直接前进
        p++;
    if(*p==null)
        p=person;
    if(*p!=null&&p!=q)        //重新回到数组头        
        check++;
                    
}
//没运行,只是个思想
2008-03-28 18:01
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
得分:0 
我也写玩玩...
#include"stdio.h"
#include"malloc.h"
int l;
typedef struct list
{
    int     n;
    bool    flag;
    struct  list *next;
}list;
list* BuiltList()
{
    list *head,*p,*pl;
    for(int i=1;i<=l;i++)
    {
        if(i==1)
        {
            head=(list*)malloc(sizeof(list));
            p=head;
            p->n=i;
            p->flag=1;
        }
        else
        {
            pl=(list*)malloc(sizeof(list));
            pl->n=i;
            pl->flag=1;
            p->next=pl;
            p=pl;
        }
    }
         p->next=head;

    return head;
}
void  num(list* head,int n,int k)
{   list *p=head;
    int  i=0,j=1;
    FILE  *fp;
    if((fp=fopen("serial1.txt","w+"))==NULL)
    {
        printf("不能打开文件");
        exit(0);
    };
    while(p->n!=n)p=p->next;
    while(i<l)
    {
        if(p->flag==1)
        {   
            if(j++<k)
        {
           p=p->next;
        }
        else
        {   j=1;
            p->flag=0;
            printf("%d\t",p->n);
            fprintf(fp,"%d\t",p->n);
            i++;
        }
        }
        else
        p=p->next;
    }
}
int main()
{   int n,k;
    list *head;
    printf("请输入队列长度,开始报数的人,报数得长度:");
    scanf("%d %d %d",&l,&n,&k);

    head=BuiltList();

    num(head,n,k);

    
    return 0;

}

学习需要安静。。海盗要重新来过。。
2008-03-28 18:33
learnerboy
Rank: 2
等 级:论坛游民
帖 子:246
专家分:22
注 册:2007-11-11
得分:0 
楼上的牛!
2008-03-28 19:50
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
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
得分:0 
#include"stdio.h"
#include"malloc.h"
int l;
typedef struct list
{
    int     n;
    int    flag;
    struct  list *next;
}list;
list* BuiltList()
{
    list *head,*p,*pl;
    int i;
    for( i=1;i<=l;i++)
    {
        if(i==1)
        {
            head=(list*)malloc(sizeof(list));
            p=head;
            p->n=i;
            p->flag=1;
        }
        else
        {
            pl=(list*)malloc(sizeof(list));
            pl->n=i;
            pl->flag=1;
            p->next=pl;
            p=pl;
        }
    }
         p->next=head;

    return head;
}
void  num(list* head,int n,int k)
{   list *p=head;
    int  i=0,j=1;
    FILE  *fp;
    if((fp=fopen("serial1.txt","w+"))==NULL)
    {
        printf("不能打开文件");
        exit(0);
    };
    while(p->n!=n)p=p->next;
    while(i<l)
    {
        if(p->flag==1)
        {   
            if(j++<k)
            {
             p=p->next;
            }
            else
            {  
                   j=1;
                 p->flag=0;
                 printf("%d\t",p->n);
                 fprintf(fp,"%d\t",p->n);
                 i++;
             }
        }
        else
        p=p->next;
    }
}
int main()
{
    int n,k;
    char i;
    list *head;
    do
    {
        printf("请输入队列长度,开始报数的人,报数得长度:");
        scanf("%d %d %d",&l,&n,&k);

        head=BuiltList();

        num(head,n,k);

        free(head);

        printf("\n运行完毕!是否要退出?(Y/N)\n");

        fflush(stdin);

        scanf("%c",&i);
        

    }while(i=='N'||i=='n');
    return 0;

}

学习需要安静。。海盗要重新来过。。
2008-03-28 22:05
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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-205843-1-1.html




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

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