那些知道自己去哪儿,知道自己该干什么的人总能很好地利用环境,在前进路上不论遇到什么,他们都能灵活周转,向着目标更进一步。他们明白自己想干什么,也愿意作出努力。
——摘自 奥格.曼狄诺《羊皮卷》
第18 题:
题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,每次从这个圆圈中删除第m 个数字
(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m 个数字。求出在这个圆圈中剩下的最后一个数字。
方法1:单链表:
typedef struct node
{
int data;
struct node *next;
}Lnode,*Linklist;
Linklist Create_link()
{
Linklist H,s,p;
s=p=NULL;
int i=0;
int number;
H=(Linklist)malloc(sizeof(struct node));
H->next=NULL;
printf("input number of person:number=");
scanf("%d",&number);
while(i<number)
{
i++;
s=(Linklist)malloc(sizeof(Lnode));
s->data=i;
s->next=NULL;
if(H->next==NULL)
H->next=s;
else
p->next=s;
p=s;//p始终指向最后一个节点;
}
p->next=H->next;
return H;
}
Lnode* findlast(Linklist H)
{
int num=1;
int m;
printf("input number of the quit:m=");
scanf("%d",&m);
if(H==NULL)
{
exit(0);
}
Lnode* p=H->next;/*指向H->next 而非 H*/
Lnode* temp=p;
while(p!=p->next)/*圆圈中不止一个数据*/
{
if(num==m-1)/*删除一m个节点,必须先找到第 m-1个节点*/
{
temp=p->next;
p->next=temp->next;
printf("free node :%4d\n",temp->data);
free(temp);
temp=NULL;
num=1;
p=p->next;
}
p=p->next;
num++;
}
return p;
}
int main(int argc,char* argv[])
{
Linklist H1=NULL;
Lnode* pnode;
H1=Create_link();
pnode=findlast(H1);
printf("the last node is %d\n",pnode->data);
return 1;
}
方法2:/*删除数字后再从头开始计数*/
int LastRemaining_Solution2(int n, unsigned int m)
{
if(n <= 0 || m < 0)
{
return -1;
}
int i;
int lastinteger = 0;
for (i = 2; i <= n; i ++)
{
lastinteger = (lastinteger + m) % i;
}
return lastinteger;
}
int main(int argc,char* argv[])
{
int last;
last=LastRemaining_Solution2(10, 3);
printf("lastone :%d\n",last);
return 1;
}
方法3:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,k,m,n,num[50];
int* p=num;
printf("input number of person:n=");
scanf("%d",&n);
printf("input number of the quit:m=");
scanf("%d",&m);
for(i=0;i<n;i++)
{
*(p+i)=i+1;
}
i=0;
k=0;
while(m<n-1)
{
printf("m=%d\n",m);
if(*(p+i)!=0) //若p指向的数字还未被删除,还有效,计数k++
{
k++;
}
if(k==m)/*将踢出的数值设置为0*/
{
printf("delete value=%d\n",*(p+i));
*(p+i)=0; //退出,对应的数组元素置为0
k=0;
m++;
}
i++;
if(i==n)//一次数组遍历完,从头开始再次遍历;
{
i=0;
}
}
while(*p==0)
{
p++;
}
printf("The last one is NO.%d\n",*p);
}