约瑟夫环--不用链表的一般c程序

约瑟夫环

         约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。它也是算法设计中一个老生常谈的问题,有循环链表法、数组法、数学分析法等。

    链表法:充分利用循环链表的循环特性,也是最容易想到、最容易实现的一种,前提是对链表要有充分的了解,对指针操作不感冒;

    数学分析法:不考虑算法问题,将约瑟夫环抽象为一个单纯的数学问题,通过数学推理,可得到一个简单的数学公式,x'=(x+k)%n,这种方法算法设计极简单,但对数学推导功底要求较高;

    数组法:为常规一般的编程方法,通过数组元素的增减处理,借助合理的逻辑设计达到的设计算法。符合常规算法设计思维,但对逻辑思维要求较高。

考虑到网上、书籍中多以链表法居多,我们就用数组法实现:
算法:

step1、一群人围在一起坐成环状(如:N)
step2、从某个编号开始报数(如:K)
step3、数到某个数(如:M)的时候,此人出列,下一个人重新报数
step4、一直循环,直到所有人出列,约瑟夫环结束,输出最后剩下的人的编号
程序设计如下:

#include<stdio.h>

int main()

{

  int i,j,k,a[10000],total,startIndex,cycleNumber,aimIndex,temp;

  printf("-------------------------\n");

  printf("请输入总人数:\n");

  scanf("%d",&total);

  printf("请输入起始编号:\n");

  scanf("%d",&startIndex);

  printf("请输入循环个数:\n");

  scanf("%d",&cycleNumber);

  for(i=0;i<total;i++)

  {

    a[i]=i+1;

  }

  aimIndex=startIndex-2;

  while(total-1)

  {

    for(i=0;i<cycleNumber;i++)

    {

       if(aimIndex<total-1)

       {

         aimIndex++;

       }

       else

       {

         aimIndex=0;

       }

    }

    for(i=aimIndex;i<total;i++)

    {

       temp=a[i+1];

       a[i]=temp;

    }

    for(i=0;i<total-1;i++)

    {

       printf("%d  ",a[i]);

    }

    printf("###\n");

    aimIndex-=1;

    total--;

  }

  printf("The last number is %d\n",a[0]);

  printf("-------------------------\n");

  return  0;

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值