读书人

一道考试题大家看一下N个人围圆圈

发布时间: 2012-02-17 17:50:42 作者: rapoo

一道考试题,大家看一下,N个人围圆圈
有N个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位?
这是一道笔试题,大家可以试试,

[解决办法]
这不就是约瑟夫环啊
[解决办法]
用数组和链表都能实现这个功能的挖
[解决办法]
这不是谭浩强老师书上的习题么?
[解决办法]
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{
int data;
struct node *next;
}LNode;

main()
{
LNode* Create(int,int);
LNode* GetNode(LNode *);
int Print(LNode *,int);
LNode *p;
int n,k,m;
do
{
printf ( "输入总人数 ");
scanf ( "%d ",&n);
}
while (n <=0);
do
{
printf ( "输入开始人的序号(1~%d) ",n);
scanf ( "%d ",&k);
}
while (k <=0 || k> n);
do
{
printf ( "输入间隔数字 ");
scanf ( "%d ",&m);
}
while(m <=0);

p=Create(n,k);
Print(p,m);
return 0;
}

LNode* Create(int n,int k)
{
int start=k-1;
LNode *s,*p,*L=0,*t;
if (start==0) start=n;
while (n!=0)
{
s=(LNode *)malloc(sizeof(LNode));
if (L==0) p=s;
if (n==start) t=s;
s-> data=n;
s-> next=L;
L=s;
n--;
}
p-> next=L;
return t;
}

LNode* GetNode(LNode *p)
{
LNode *q;
for (q=p;q-> next!=p;q=q-> next);
q-> next=p-> next;
free (p);
return (q);
}

Print(LNode *p,int m)
{
int i;
printf ( "出队编号:\n ");
while (p-> next!=p)
{
for (i=1;i <=m;i++)
p=p-> next;
printf ( "%d ",p-> data);
p=GetNode(p);
}
printf( "%d\n ",p-> data);
return 0;
}
[解决办法]
整个循环链表就可以了
[解决办法]
呵呵,就是谭老师的教材习题嘛。
下面给出教材配套的习题答案:
===========================
#include <iostream>
using namespace std;
int main()
{int i,k,m,n,num[50],*p;
cout < < "input number of person: n= ";
cin> > n;
p=num;
for (i=0;i <n;i++)
*(p+i)=i+1; // 以1至n为序给每个人编号
i=0; // i为每次循环时计数变量
k=0; // k为按1,2,3报数时的计数变量
m=0; // m为退出人数
while (m <n-1) // 当退出人数比n-1少时(即未退出人数大于1时)执行循环体
{if (*(p+i)!=0) k++;
if (k==3) // 将退出的人的编号置为0
{*(p+i)=0;
k=0;
m++;
}
i++;
if (i==n) i=0; // 报数到尾后,i恢复为0
}
while(*p==0) p++;
cout < < "The last one is NO. " < <*p < <endl;
return 0;
}
============================
这是原文,我没改动过的。

读书人网 >C++

热点推荐