约瑟夫问题

  链表是c语言中的一个重要的组成部分,数组有它的不足之处,就是在刚开始定义数组时必须明确它的元素的个数。但是,在实际应用的过程中,经常可能要用多次数组,这样的话就必须在开始定义一个比较大的数组,而这样的话又恰恰会浪费一定的存储空间,这样的话用链表就可以解决这个问题。链表也是c语言中和指针,位运算一样,一些比较特色而又比较重要的功能。而接下来要写的就是用链表解决的约瑟夫问题。

  约瑟夫问题的简单描述:N个人围成一圈,从第一个人开始报数,第M个将被杀掉,依次进行,最后只剩下一个,其余人将被杀掉,这就是著名的约瑟夫问题,以下的代码中将用41个人作为例子来用c语言解决约瑟夫问题。

  
 链表是c语言中的一个重要的组成部分,数组有它的不足之处,就是在刚开始定义数组时必须明确它的元素的个数。但是,在实际应用的过程中,经常可能要用多次数组,这样的话就必须在开始定义一个比较大的数组,而这样的话又恰恰会浪费一定的存储空间,这样的话用链表就可以解决这个问题。链表也是c语言中和指针,位运算一样,一些比较特色而又比较重要的功能。而接下来要写的就是用链表解决的约瑟夫问题。

  约瑟夫问题的简单描述:N个人围成一圈,从第一个人开始报数,第M个将被杀掉,依次进行,最后只剩下一个,其余人将被杀掉,这就是著名的约瑟夫问题,以下的代码中将用41个人作为例子来用c语言解决约瑟夫问题。

#include <stdio.h>
#include <stdlib.h>
struct Jew {
int number;
struct Jew* next;
};


int main (int argc, char ** argv)
{
struct Jew* jew;
struct jew* r;
int N;
int M;
int i;
printf ("Please input number of Jew(N) and interval (M):\n");
scanf ("%d,%d",&N,&M);
jew =(struct Jew*)malloc(N * sizeof(struct Jew)); 

  r=jew;/*→X链表的第一个节点*/

for (i=1;i<N;i++)
{
r →number=i;
r →next=jew+1;
r = r →next;

r→number=N;
r→next=jew;/*链表的最后一个节点指向第一个节点的地址,形成环形链表*/
printf("Suicide order:\n");
while (r!=r→next)
{
for (i=0;i<(M-1);i++)
r=r→next;
printf ("%4d",r→next→number);
r→next=r→next→next;

printf ("\n When N =%d and M=%d,Josephus, hiding in posotion %d survives. \n,N ,M,r→nunumber");
free (jew);
return 0;

}

  这就实现了约瑟夫问题,41个人,在31号位置的得以幸存。

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值