华为2013校招之哈工大威海 上机试题之一:报数问题:设有N 个人围坐一圈并按顺时针方向从1 到N 编号,从第S个人开始进行1 到M报数,报 数到第 M个人时,此人出圈,再从他的下一个人重新开始1 到 M的报数,如此进行下去直 到所有的人都出圈为止。现要打印出出圈次序。

时间:2021-02-22 21:53:33

1.  报数游戏

问题描述:

设有N 个人围坐一圈并按顺时针方向从1 到N 编号,从第S个人开始进行1 到M报数,报

数到第 M个人时,此人出圈,再从他的下一个人重新开始1 到 M的报数,如此进行下去直

到所有的人都出圈为止。现要打印出出圈次序。

要求实现函数:

void circle_sort (int n, int s, int m, int *p)

输入:n 游戏总人数  s 报数的起始编号  m 报数的数值

输出:p 指向长度为n的数组,出圈次序保存在 p指向的数组中

示例

n=7 s=2 m=3  出圈次序为:4 7 3 1 6 2 5

n=3 s=1 m=2  出圈次序为:2 1 3

// tst.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include<iostream>
using namespace std;

/*void circle_sort (int n, int s, int q, int *p)
{

}*/
int main()
{
typedef struct man{
int num;
struct man *next;
}node;

node *head,*s,*p_p,*p_q;
int n =3,k=1,m=2;
head = (node*)malloc(sizeof(node));
p_p = head;
for (int i=1;i<=n;i++)
{
s = (node *)malloc(sizeof(node));//申请节点空间
s->num = i;//填数
//cout<<"s->data:"<<s->num<<"\n";
//连接节点
p_p->next = s;
p_p = s;
}

p_p->next = head->next; //最后一个指向第一个节点
//cout<<"第一个节点是:"<<p_p->next->num<<"\n";
//////////////////////////////////////////////////////////////////////////
//找到开始位置
for (int j=0;j<k;j++)
{
p_p=p_p->next;
}
//cout<<"开始计数位置:"<<p_p->num<<"\n";

while(n)
{

for (int j=1;j<m;j++)
{
p_p=p_p->next;
//cout<<"移动后依次为:"<<p_p->num<<"\n";
}
cout<<"选中的数是:"<<p_p->num<<"\n";
p_q = p_p->next;
p_p->num = p_q->num;
p_p->next = p_q->next;
free(p_q);
n--;
}

}