标题:求幸运数字
只看楼主
aiyinsitan
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:183
专家分:177
注 册:2010-4-22
结帖率:89.47%
已结贴  问题点数:20 回复次数:8 
求幸运数字
n个人站成一个圈,然后报数,隔个的就出去,剩下的两个数字是幸运数字,3<=n<=50;
比如说 1,2,3,4,5,6  则2463出队  1,5是幸运数字 1,2,3,4,5  则2,4,1出队  3,5是幸运数字
看一下我的程序:
#include "iostream.h"
void pd(int *,int );
void pd1(int *,int );
void main()
{
    int n,i,*p,*r;
    cin>>n;
    if(n<3||n>50)
    cout<<"请正确输入:";
    else
   
    for(i=0;i<n;i++)
    {
        *p=i+1;
        p++;
    }
    r=p-n;
    pd(r,n);
}
void pd(int *p,int n)
{
    int  *q,*k;
       if(n%2==0)                //如果n是偶数就把隔空数输出
       {                         //
                                 //
        for(int i=0;i<n;i=i+2)   //就把隔个数字输出
        {
            cout<<*(p+1)<<" ";
        p=p+2;
        }
        p=p-n;
        for( i=0;i<n/2;i++)//把剩下的留下来放在一个数组中 再去判断
        {
            *q=*p;
            p=p+2;
            q++;
        }
        p=p-n/2;
        n=i;
        }
        else //n为奇数时
        {
            
           for(int i=0;i<n;i=i+2)//先把隔个数字输出
        {
            cout<<*(p+1)<<" ";
           p=p+2;
        }
            *k=*(p+1);//n是奇数话,最后一个将是幸运数字,所以要保留  把他放在数组的第一个位置;
            k++;
       for(i=1;i<n/2+1;i++)//然后把保留的数字保留继续去判断
        {
            *k=*p;
            p=p+2;
            k++;
        }
       p=p-n/2-1,n=i;

        }
    if(n<3)
    for(int i=0;i<n;i++)//如果是小于3,直接输出幸运数
    {
        cout<<*p;
        p++;
    }
    else
        pd(p,n);
        
}
他显示只有警告  但是不见运行的窗口  麻烦大家帮我看一下  或者觉得有更好的程序 可以发给我看看  谢谢!!!!
搜索更多相关主题的帖子: 数字 幸运 
2010-12-08 21:53
aiyinsitan
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:183
专家分:177
注 册:2010-4-22
得分:0 
把前面的pd1函数删除
2010-12-08 21:54
aiyinsitan
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:183
专家分:177
注 册:2010-4-22
得分:0 
怎么没人回帖啊  很急
2010-12-09 13:06
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
得分:7 
程序代码:
#include <iostream.h>
void pd(int *,int );
void pd1(int *,int );
void main()
{
    int n,i,*p,*r;
    cin>>n;
    if(n<3||n>50)
    {
        cout<<"输入错误!:";
        return ;
    }
    else
    {
        p=new int[n];//分配内存空间
        for(i=0;i<n;i++)
        {
            *p=i+1;
            p++;
        }
        r=p-n;
        pd(r,n);
    }

}
void pd(int *p,int n)
{
    int  *q,*k;
       q=new int[n];
       k=new int[n];//同样的道理
       if(n%2==0)                //如果n是偶数就把隔空数输出
       {                         //
                                 //
        for(int i=0;i<n;i=i+2)   //就把隔个数字输出
        {
            cout<<p[i]<<" ";
        }
        for( i=0;i<n/2;i++)//把剩下的留下来放在一个数组中 再去判断
        {
            *q=*p;
            p=p+2;
            q++;
        }
        p=p-n/2;
        n=i;
       }//if
       else //n为奇数时
        {
           
           for(int i=0;i<n;i=i+2)//先把隔个数字输出
           {
            cout<<*(p+1)<<" ";
            p=p+2;
           }
            *k=*(p+1);//n是奇数话,最后一个将是幸运数字,所以要保留  把他放在数组的第一个位置;
            k++;
       for(i=1;i<n/2+1;i++)//然后把保留的数字保留继续去判断
       {
            *k=*p;
            p=p+2;
            k++;
       }
       p=p-n/2-1,n=i;

        }
    if(n<3)
    for(int i=0;i<n;i++)//如果是小于3,直接输出幸运数
    {
        cout<<*p;
        p++;
    }
    else
        pd(p,n);
       
}
好了 已经可以输出来了  剩下的算法是你自己的  我就不看了  你自己改下

                                         
===========深入<----------------->浅出============
2010-12-09 13:26
jianghong_02
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:143
专家分:476
注 册:2010-10-2
得分:7 
void pd(int *p,int n)
你用的是无返回值类型的函数,你在MAin()函数中怎么能将你要的值返回呢?还有一个void pd1(int *,int );你是用来做什么的,那有哪一些行为?
2010-12-09 13:36
jianghong_02
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:143
专家分:476
注 册:2010-10-2
得分:0 
不好意思,我看错了,
2010-12-09 13:38
aiyinsitan
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:183
专家分:177
注 册:2010-4-22
得分:0 
非常感谢 调试好了
#include <iostream.h>
#include <stdlib.h>
void pd(int *,int );

void main()
{
    int n,i,*p,*r;
    cin>>n;
    if(n<3||n>50)
    {
        cout<<"输入错误!:";
        return ;
    }
    else
    {
        p=new int[n];//分配内存空间
        for(i=0;i<n;i++)
        {
            *p=i+1;
            p++;
        }
        r=p-n;
        pd(r,n);
   



    }

   

}
void pd(int *p,int n)
{
    int  *q,*k;
       q=new int[n/2];
       k=new int[n/2+1];//同样的道理
       if(n%2==0)                //如果n是偶数就把隔空数输出
       {                         //
                                 //
        for(int i=1;i<n;i=i+2)   //就把隔个数字输出
        {
            cout<<p[i]<<" ";
        }
        for( i=0;i<n/2;i++)//把剩下的留下来放在一个数组中 再去判断
        {
            *q=*p;
            p=p+2;
            q++;
            
        }
        
        p=q-n/2;
        n=i;
        if(n>=3)
        {
            pd(p,n);
        }
        else
        {
  cout<<endl;
     for(int i=0;i<n;i++)//如果是小于3,直接输出幸运数
    {
        cout<<*p<<" ";
        p++;
    }
        }

       }//if
       else  //n为奇数时
        {
           
           for(int i=1;i<n;i=i+2)//先把隔个数字输出
           {
            cout<<p[i]<<" ";
           }
            *k=p[n-1];//n是奇数话,最后一个将是幸运数字,所以要保留  把他放在数组的第一个位置;
            k++;
       for(i=1;i<n/2+1;i++)//然后把保留的数字保留继续去判断
       {
            *k=*p;
            p=p+2;
            k++;
       }
       p=k-n/2-1,n=i;
      if(n>=3)
        {
            pd(p,n);
        }
        else
        {
      cout<<endl;
     for(int i=0;i<n;i++)//如果是小于3,直接输出幸运数
    {
        cout<<*p<<" ";
        p++;
    }

        }
       }
   
}
/*void pd1(int *p,int n)
{
if(n<3)
    for(int i=0;i<n;i++)//如果是小于3,直接输出幸运数
    {
        cout<<*p;
        p++;
    }
    else
        pd(p,n);*/
2010-12-09 16:16
aiyinsitan
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:183
专家分:177
注 册:2010-4-22
得分:0 
请问这个有更简单的算法吗??  我感觉的我的好复杂
2010-12-09 16:17
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
得分:7 
回复 楼主 aiyinsitan
可以使用链表来实现这个。
每次报数就把出列的人从链表上面摘下来。
这样逻辑很清楚。思路也很清晰。

希望对你有帮助!

南国利剑
2010-12-10 00:55



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




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

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