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--;
}
}