// 题目: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");
}