Josephus问题的一个C语言程序

来源:互联网 发布:面试java项目技术难点 编辑:程序博客网 时间:2024/06/06 17:31

Josephus问题的一个C语言程序

问题描述:

n个人围坐一圈,从第一个人开始报数“1,2,3,4….m,数到m的人出局,然后下一个人从1开始继续,这样直到最后一个人为胜利者,输出胜利者是第几个人。

函数功能:

功能:josep函数,输入成员数n和停止数m,返回最后留下的人的编号。

代码:

以下代码在VS2012平台创建:

#include<stdio.h>#include<stdlib.h>int josep( int , int );int delay();int main(){    int flag=1;    while(flag)    {        int number,point,winner;        printf( "************************welcome*************************\n**  游戏规则:任意几个人围坐一圈,从第一个人开始报数  **\n**  “1,2,3,4....,数到规定的数字的人出局,然后下    **\n**  一个人从1开始继续,这样直到最后一个人为胜利者。   **\n********************************************************\n\n请输入玩家人数(整数):" );        scanf( "%d", & number );        printf( "\n请输入报数最大值(整数):" );        scanf( "%d", & point );        winner=josep(number,point);        printf( "\n\n玩家%d是最终胜利者!\n\n",winner );        flag=3;        while (3==flag)//判断是否重新输入数字        {            printf( "\n\n是否重新输入数字(1为是,2为否)?\n请输入:" );            scanf( "%d", & flag );            if (1==flag)                flag=1;            else if (2==flag)                flag=0;            else             {                flag=3;                printf( "\n输入数字错误!\n" );            }        }    }    return 0;}int josep( int n , int m ){    int i,j,winner;    int *num = ( int * )malloc( n * sizeof(int) );//创建玩家数组    if ( num == NULL )    printf( "内存分配错误,请重启程序" );    for ( i=0 ; i<n ; i++)//初始化玩家数组,分别编号。    {        num[i]=i+1;     }    printf( "\n玩家编号完成");    i=0;    while ( n > 1 )    {        i=( i + m - 1 ) % n;//核心算法,计算出局人。        printf( "\n玩家%d被淘汰出局",num[i] );        delay();        for ( j=i+1;j<n;j++)//移动座位            num[j-1]=num[j];        n--;//人数减一        if (i==n)            i=0;    }    winner=num[0];    free (num);    return winner;  }/**延时函数**/int delay(){    int i,j;    for (i=0;i<5000;i++)        for(j=0;j<5000;j++);    return 0;}

控制台界面如下

这里写图片描述

原创粉丝点击