题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。用链表实现最简单了,数组的话可能要加很多的判断,逻辑搞不好会出错。链表的C实现不熟悉,用别人的程序改的。panda程序有点高大上。都贴在下面对比下吧。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *link;
}Node,*Linkedlist;
Linkedlist initialLinkedList(int n)
{
int i;
Linkedlist head,curr,temp;
head = (Linkedlist)malloc(sizeof(Node));
head->data = 0;
head->link = NULL;
curr = head;
for (i=1;i<n;i++)
{
temp = (Linkedlist)malloc(sizeof(Node));
temp->data = i;
temp->link = NULL;
curr=curr->link = temp;
}
curr->link = head;
return head;
}
int main(void)
{
int i;
int n,m;
int res;
Linkedlist head=NULL;
Linkedlist curr,del;
printf("Enter n:\n");
scanf("%d",&n);
printf("enter m:\n");
scanf("%d",&m);
head = initialLinkedList(n);
del = curr = head;
while(n-->1)
{
for (i=0;i<m-1;i++)
{
curr=del;
del=del->link;
}
curr->link = del->link;
free(del);
del = curr->link;
}
res = curr->data;
printf("the result is:\n");
printf("%d\n",res);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *link;
}LNode,*Linklist;
Linklist list(int n)
{
int i;
Linklist head,curr,t;
head = (Linklist)malloc(sizeof(LNode));
head->data = 0;
head->link = NULL;
curr = head;
for (i=1;i<n;i++)
{
t = (Linklist)malloc(sizeof(LNode));
t->data = i;
t->link = NULL;
curr->link = t;
curr = t;
}
curr->link = head;
return head;
}
int main(void)
{
int n,m,p;
int res;
Linklist head=NULL;
Linklist curr,del;
printf("input the number n:\n");
scanf("%d",&n);
head = list(n);
printf("input the number m:\n");
scanf("%d",&m);
del = curr = head;
while(n>1)
{
for (p=m-1;p--;curr=del,del=del->link);
curr->link = del->link;
free(del);
del = curr->link;
n--;
}
res = curr->link->data;
printf("the result is:\n");
printf("%d\n",res);
return 0;
}
以及同学推荐的一篇博文和一个演示网页