做自己的快乐人

路漫漫其修远兮,吾将上下而求索

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

问题描述:编号为1,2,………,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。

程序如下:C++编写,在visual C++2010上测试通过。

#include <iostream>

using namespace std;

/*人物的定义,包含自己的编号,所持的密码,和指向下一个的指针*/
struct Person
{
    int num;
    int cipher;
    Person * next;
};

Person person[7];

void Circle();

void main()
{
    Circle();
    int m;//开始时输入的起始密码值
    cin>>m;

    Person * currentPerson;//方便对人物链表的搜索
    Person * prePerson;

    currentPerson=&person[0];//开始时将指针指向人物的第一个和最后一个
    prePerson=&person[6];

    while(currentPerson!=prePerson)
    {
        for(int i=1;i<m;i++)//移动指针,使其指向需要移出的人物
        {
            prePerson=currentPerson;
            currentPerson=currentPerson->next;
        }
        m=currentPerson->cipher;
        cout<<currentPerson->num<<"  ";//输出人物的编号

        prePerson->next=currentPerson->next;//修改链表,使选定的人物移出
        currentPerson=prePerson->next;
    }

    cout<<currentPerson->num;//输出最后一个人物的编号
    cin>>m;
}

void Circle()//对人物的属性进行编辑
{
    for(int i=0;i<7;i++)
    {
        person[i].num=i+1;
        person[i].next=&person[i+1];
    }
    person[6].next=&person[0];//使最后一个人物的指针指向第一个,构成循环链表

    person[0].cipher=3;
    person[1].cipher=1;
    person[2].cipher=7;
    person[3].cipher=2;
    person[4].cipher=4;
    person[5].cipher=8;
    person[6].cipher=4;
}

posted on 2010-08-11 16:29  做自己的快乐人  阅读(255)  评论(0编辑  收藏  举报