/*此方法是利用循环链表
#include <iostream>
using namespace std;
typedef struct _Node
{
int element;
_Node * next;
}Node;
//约瑟夫问题-n(1, 2,...n)个人,从第k个报数,报数到m的那个人出列,
//他的下一个人从1开始报数,报数到m的那个出列,以此类推
void Josephus(int n, int k, int m)
{
//根据n创建循环链表
Node * head = (Node *)malloc(sizeof(Node)); //头结点
head->next = NULL;
int i;
Node * p = head;
Node * pTemp = NULL;
for (i = 0; i < n; i++)
{
pTemp = (Node *)malloc(sizeof(Node));
pTemp->element = i + 1; //编号从1开始
pTemp->next = NULL;
p->next = pTemp;
p = pTemp;
}
p->next = head->next; //链表最后一个结点指向第一个节点
//找到编号为k的节点
p = head->next;
Node * pre = head;
while (p != NULL)
{
if (p->element == k)
{
break;
}
pre = p;
p = p->next;
}
//按规则输出
for (i = 0; i < n; i++) //总共n个结点,需循环n次
{
for (int j = 0; j < m - 1;j++) //从指针指向的那个节点开始报数,报数到m,所以循环m-1次
{
pre = p;
p = p->next;
}
cout << p->element << " ";
pre->next = p->next;
free(p);
p = pre->next;
}
free(head); //释放头结点
}
int main()
{
Josephus(8,1,4);
return 0;
}*/
//接下来是基础的C代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j,n,m,*p;
scanf("%d%d",&n,&m);
p=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
p[i]=i+1;
i=0;
while(n>1)
{
i=(i+m-1)%n;
printf("%-4d",p[i]);
for(j=i+1;j<n;j++)
p[j-1]=p[j];
n--;
if(i==n)
i=0;
}
printf("\n%d\n",p[0]);
free(p);
return 0;
}
原文地址:http://blog.csdn.net/u010951938/article/details/39137637