注册 登录
编程论坛 C++教室

求幸运数字

aiyinsitan 发布于 2010-12-08 21:53, 878 次点击
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);
        
}
他显示只有警告  但是不见运行的窗口  麻烦大家帮我看一下  或者觉得有更好的程序 可以发给我看看  谢谢!!!!
8 回复
#2
aiyinsitan2010-12-08 21:54
把前面的pd1函数删除
#3
aiyinsitan2010-12-09 13:06
怎么没人回帖啊  很急
#4
laoyang1032010-12-09 13:26
程序代码:
#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);
      
}
好了 已经可以输出来了  剩下的算法是你自己的  我就不看了  你自己改下
#5
jianghong_022010-12-09 13:36
void pd(int *p,int n)
你用的是无返回值类型的函数,你在MAin()函数中怎么能将你要的值返回呢?还有一个void pd1(int *,int );你是用来做什么的,那有哪一些行为?
#6
jianghong_022010-12-09 13:38
不好意思,我看错了,
#7
aiyinsitan2010-12-09 16:16
非常感谢 调试好了
#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);*/
#8
aiyinsitan2010-12-09 16:17
请问这个有更简单的算法吗??  我感觉的我的好复杂
#9
南国利剑2010-12-10 00:55
回复 楼主 aiyinsitan
可以使用链表来实现这个。
每次报数就把出列的人从链表上面摘下来。
这样逻辑很清楚。思路也很清晰。

希望对你有帮助!
1