| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 758 人关注过本帖
标题:这是怎么了呀???
只看楼主 加入收藏
悠灵逃了...
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2008-1-11
收藏
 问题点数:0 回复次数:4 
这是怎么了呀???
[bo]正确的结果应该为7,14,21,28,24,16,8,2,11,20,30,19,9,4,17,29,15,1,18,26,6,13,23,5,25,12,3,10,27,
猴王为22
      本人刚学编程不久,实在不知道我错在哪个地方,望高手邦一下,能够共同进步吧[/bo]

/*                  选猴王
   有一群猴子(n个)选猴王,它们排成一行 ,来回从1至P报数,报P者出列,最后一个未出列的便是猴王*/


#include<iostream.h>
#define M 30
#define p 7
int  main()
{
    int i,a,c,r,s,x[M];//x[m]用来存放猴子的序号
    for(i=0;i<M;i++)//对数组赋初值
        x[i]=i+1;

    i=0;a=0;c=1;r=M-1;s=0;//S为左边界,R为右边界
    while(r!=s)    //左边界和右边界相等,则只有最后一个元素了,退出循环
    {
        if(x[i]!=0)  
        {
            a++;    // a记录走的有效步数,就是如果x[i]==0这个地方已经没有猴子了,a就不加
            if(a%p==0)
            {
                x[i]=0;//如果是P的倍数,则表示数到P,就将该位置赋值为0
                cout<<i+1<<" ";    
            }
        }        
        if(i==r)  //如果数到了右端尽头,就把以c变成-1,i自减,以完成再从右向左数过来
        {
            c=-1;
            while(x[r]==0)//如果右端边界为0了,则以此得到新的边界
                  r--;  
            i=r;
        }
       else  if(i==s)//同上一个while ,s为左边界
         {
            c=1;
            while(x[s]==0)
              s++;
         i=s;
         }
        else     //不在边界上,则通过+C实现自增或自减
          i=i+c;   
    }
    cout<<endl;
    cout<<"猴王为"<<r+1<<endl;
    return 0;
}
搜索更多相关主题的帖子: include 学编程 猴王 
2008-02-28 22:53
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
选猴王在c里面用链表写过了.....
2008-02-28 23:01
a19870502
Rank: 1
等 级:新手上路
帖 子:114
专家分:0
注 册:2007-10-31
收藏
得分:0 
用循环链表做会比较好吧~~~个人观点~~
2008-02-29 13:42
悠灵逃了...
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2008-1-11
收藏
得分:0 
同意楼上的,不过那个都写烦了,想试一下用数组写,看来没人能帮俺了,我觉得我的思路上对的,就是不知道为什么运行结果是那样,很苦闷
2008-02-29 21:54
wqhai123
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-4-20
收藏
得分:0 
#include<iostream>
#include<string>
using namespace std;
int asd(int m,int n);
void main()
{
    int m1,n1;
    cout<<"输入多少只猴子排成一行";
    cin>>m1;
    cout<<"输入数到几的猴子离开: ";
    cin>>n1;
  int k;
  k=asd(m1,n1);

    
    cout<<"猴王是:"<<k<<endl;
}
int asd(int m,int n)
{
    int* pa=new int[m];
    for(int i=0;i<m;i++) pa[i]=i+1;
    int k=0;
    i=-1;
    while(1)
    {
        for(int j=0;j<n;)
        {
            i=(i+1)%m;
            if(pa[i]!=0) j++;
        }
        k++;
        if(k==m) break;
        pa[i]=0;
    }
    return pa[i];
}
2008-03-01 12:17
快速回复:这是怎么了呀???
数据加载中...
 
   



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

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