标题:【求助】猴子选大王 代码中的一个问题
只看楼主
烈性炸药
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-11-6
 问题点数:0 回复次数:4 
【求助】猴子选大王 代码中的一个问题
一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王
//link.h
template <class T>
struct node{
    T data;
    node<T> *next;
};
//猴子选大王.cpp
#include<iostream.h>
#include"link.h"//引入头文件
void init_list(node<int> *first,int m)
{
    //生成m个节点的循环链表
    node<int> *p,*q;
    p=first;
    p->data=1;
    for(int i=2;i<=m;i++){
        q=new node<int>;
        p->next=q;
        p=q;
        p->data=i;
        p->next=first;
    }
}
void main()
    {
    int m,n,l;
    cout<<"请输入猴子的个数:";
    cin>>m;
    cout<<"请输入N:";
    cin>>n;
    node<int> *first;
    first=new node<int>;
    first->next=first;
    init_list(first,m);
    node<int> *p,*q;
    q=new node<int>;
    p=new node<int>;
    p=first;
    while(p->next!=p)
    {
    //循环的终止条件为链表只剩一个节点
    for(int i=1;i<n;i++)
    {
    if(i==n-1)                                                //就是这里,为什么不是i==n呢?高手指点下!!!!谢谢!!!
    q=p;
    p=p->next;
    }
        p=p->next;
        q->next=p;
    }
    cout<<"成为大王的猴子为第"<<p->data<<"个"<<endl;
}
搜索更多相关主题的帖子: 猴子 大王 node int 代码 
2008-01-02 18:30
Lonelie
Rank: 1
来 自:xmu
等 级:新手上路
帖 子:47
专家分:0
注 册:2007-12-13
得分:0 
上面不是写着“循环终止的条件为链表只剩一个节点”吗……
当i==n-1时刚好剩一个节点,i==n时就退出循环了
呵呵,你仔细看看吧
2008-01-02 21:04
zylss007
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-12-5
得分:0 
#include<iostream.h>应该是#include<iostream>不应该有.h.
还有应该加上 using namespace std;
程序没有问题,头文件的问题
2008-01-03 16:04
wsw771006
Rank: 2
等 级:论坛游民
帖 子:16
专家分:22
注 册:2007-12-16
得分:0 
猴子选大王可以不用复杂的链表结构的,看下面的程序用数组也可以解决
#include <iostream>
using namespace std;

int main ()
{
    unsigned int m,n;
    cout<<"输入猴子的个数和从第几个开始:"<<endl;
    cin>>m>>n;
    int*p=new int[m];
    for(int i=0; i<m; i++)p[i]=1;
    int count=0;            //count记录数到第几个
    int total=0;            //total记录剔出了多少猴子        
    for(i=0; total<m-1;)
    {
        count+=p[i];
        if(count==n)    //当记录数等于n时
        {
            p[i]=0;        //将对应的猴子剔出
            count=0;    //同时计数器置零
            total++;
        }
        if(++i>=m)i=0;
    }
    cout<<"大王是第"<<i+1<<"只猴子"<<endl;
    delete []p;
    return 0;
}
2008-01-03 22:07
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
得分:0 
template <class T>
struct node{
    T data;
    node<T> *next;
};
//猴子选大王.cpp
#include<iostream.h>
//#include"link.h"//引入头文件
void init_list(node<int> *first,int m)
{
    //生成m个节点的循环链表
    node<int> *p,*q;
    p=first;
    p->data=1;
    for(int i=2;i<=m;i++){
        q=new node<int>;
        p->next=q;
        p=q;
        p->data=i;
        p->next=first;
    }
}
void main()
    {
    int m,n,l,j=1;
    cout<<"请输入猴子的个数:";
    cin>>m;
    cout<<"请输入N:";
    cin>>n;
    node<int> *first;
    first=new node<int>;
    first->next=first;
    init_list(first,m);
    node<int> *p,*q,*r;
    p=first;
    q=first;
    r=first;
    do
    {
        r=r->next;
    }while(r->next!=first);
    while(p->next!=p)
    {
    //循环的终止条件为链表只剩一个节点
    
    q=p->next;
    
    if(j++%n==0)
    {
        r->next=q;
    }
    r=p;
    p=p->next;
    }
    cout<<"成为大王的猴子为第"<<p->data<<"个"<<endl;
}
应该可以得到答案了,我觉得对于单向链表用三个指针可以更清楚些.
2008-01-06 22:03



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




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

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