n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,每次从这个圆圈中删除第m 个数字

// 题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,每次从这个圆圈中删除第m 个数字

 

方法1,思想:采用循环链表的结构。也是对圆圈的模拟。思想好理解

方法2,使用数组,但是要注意,对循环数组,也是对圆圈的模拟。代码量少

方法1:


#include <iostream>
using namespace std;

typedef struct LNode
{
    int data;
    struct LNode *next;
}*pLinkNode;

pLinkNode CreateLinkList(int &num)
{
    int i = 0;
 pLinkNode p = NULL;
 pLinkNode r = NULL;
 pLinkNode head = NULL;

 head = (pLinkNode) malloc(sizeof(LNode));
 head->next = NULL;
 p=head;

 for(i=0; i<num; i++ )
 {
     r = (pLinkNode) malloc(sizeof(LNode));
  r->data = i;
  p->next = r;
  p = r;
 }
 p->next = head->next;  // 循环链表的标志
 p=p->next;  // 此处以可以return head->next;
 return p; // 头结点指向的第一个元素
}

void  FindNum(pLinkNode &s)
{
 int m = 0;
 int count=1;
 pLinkNode pn;
 

 cout<<"请输入要删除的序号"<<endl;
 cin>>m;
 cout<<"输出序列为:"<<endl;
 while(s->next != s)  //  当s->next == s,此时只剩一个结点

{
     
count++;//必然存在大于1个数。count从1开始,第一个数为1。
     s= s->next;
     if(count == m-1)
     {
         pn = s->next;
       cout<<pn->data<<endl;
      s->next = pn->next;
      count=0;
     }
 }
 cout<<"最后一个输出的数为:"<<endl;
 cout<<s->data<<endl;
 return ;
}

int main()
{
    int n;
    int m;
    pLinkNode H1;
    cout<<"请输入总数"<<endl;
    cin>>n;
    H1=CreateLinkList(n);
    FindNum(H1);
    return 0;
}

 

方法2:

void joy( int* pArray , int len , int start )
{
 if( pArray == NULL || len < 0 || start < 0 || start > len )
  return ;
  int count=0;
  int number=len;
  while( number >= 1 )
  {
   if( pArray[start] != 0 )
   {
    count++;
    if(count == 3)
    {
   if (number == 1 )
     printf("%d \n",pArray[start]);

   pArray[start] = 0;
   count = 0;
   number--;
    }   
   }
   start++;
   start=start % len;
  }
}
void main()

 int a[8];
 int length=sizeof(a)/sizeof(int);
 for(int i=0; i<length; i++)
 {
    a[i] = i + 1 ;
 }
 joy( a , length , 0 );
 system("pause");
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值