C语言版约瑟夫问题算法实现

 更新时间:2021年12月31日 11:39:39   作者:不要闻蚊香  
大家好,本篇文章主要讲的是C语言版约瑟夫问题算法实现,感兴趣的同学赶快来看一看吧,对你又帮助的话记得收藏一下,方便下次浏览

1、问题描述:

       有n个人围坐一圈,现从第s个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人又出列.如此下去,直到所有人都出列为止.试设计确定他们出列次序序列的程序

2、算法步骤:

        1、确定存储结构:n个人围成一圈,故使用循环单链表来存储序号

        2、算法实现:

该问题共n、m、s三个未知量,所以可以通过三个循环来实现,第一个循环用来确定最开始第一个报数的人的指针位置(单链表的头节点指针指向第s个人),第二个循环用来控制输出序号的次数(共n次),第三个循环用来数数(每一次循环使指针移动m次)

3、实现源代码:

# include <stdio.h>
# include <malloc.h>
 
typedef struct Node
{
	int number;
	struct Node * pNext;
}NODE, *PNODE;
 
PNODE creat_list(int n);
 
int main (void)
{
	int n,m,s;
	printf("约瑟夫环问题:\n");
	printf("设有n(编号为“0 1 2 3 .....n-1 n”)个人围坐一圈,现从第s个人开始报数,数到m的人出列,\n求最后的出列顺序。\n");
	printf("请设置n, s, m :\n");
	printf("n = ");
	scanf("%d", &n);
	printf("s = ");
	scanf("%d", &s);
	printf("m = ");
	scanf("%d", &m);                    //问题引导提示代码段
 
 
	PNODE pHead = NULL;
	pHead = creat_list(n); 
    pHead->number = 1;                   //创建单链表
 
	PNODE p = pHead;                       //定义头指针
	int i,j,k;                            //定义循环参数
	for(j = 1; j < s; j++)
		{
			p = p->pNext;
		}                                //第一个循环确定第一个报数的人在循环单链表中的位置  
 
	for(i = 1; i <= n; i++)              //外部循环代表遍历到最后一个所需要的循环次数
	{
		for(k = 1; k < m; )              //内部循环代表遍历出列的人
		{
			if(p -> pNext -> number != 0)
			{
				p = p -> pNext;
				k++;
			}
			else
			{
				p = p -> pNext;
			}
		}
		printf("%d  ",p -> number);
		p -> number = 0;
	    do
		{
		    p = p -> pNext;
		}while(p -> number == 0); 
	}
	printf("\n");
	
	return 0;
}
PNODE creat_list(int n)                        //单链表的创建
{
	PNODE pHead = (PNODE)malloc(sizeof(NODE));
    PNODE pTail = pHead;
	int i;
    for(i = 2; i <= n; i++)
	{
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		pNew->number = i;
		pTail->pNext = pNew;
		pNew->pNext = pHead;
		pTail = pNew;
	}
	return pHead;
}

到此这篇关于C语言版约瑟夫问题算法实现的文章就介绍到这了,更多相关C语言约瑟夫问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VScode + keil开发环境搭建安装使用过程

    VScode + keil开发环境搭建安装使用过程

    这篇文章主要介绍了VScode + keil开发环境搭建及安装使用过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • C++抛出和接收异常的顺序

    C++抛出和接收异常的顺序

    这篇文章主要介绍了C++抛出和接收异常的顺序,帮助大家更好的理解和学习C++,感兴趣的朋友可以了解下
    2020-08-08
  • C++中Digraphs、Trigraphs和Tokens的深入讲解

    C++中Digraphs、Trigraphs和Tokens的深入讲解

    这篇文章主要给大家介绍了关于C++中Digraphs、Trigraphs和Tokens的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • C语言实现linux网卡连接检测的方法

    C语言实现linux网卡连接检测的方法

    这篇文章主要为大家详细介绍了C语言实现linux网卡连接检测的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • C++结构体作为函数参数传参的实例代码

    C++结构体作为函数参数传参的实例代码

    这篇文章主要介绍了C++结构体作为函数参数传参的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • va_list(),va_start(),va_arg(),va_end() 详细解析

    va_list(),va_start(),va_arg(),va_end() 详细解析

    这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件.下面我们写一个简单的可变参数的函数,该函数至少有一个整数参数,第二个参数也是整数,是可选的.函数只是打印这两个参数的值
    2013-09-09
  • 详解C++中StringBuilder类的实现及其性能优化

    详解C++中StringBuilder类的实现及其性能优化

    在Java和C#中,StringBuilder可以创造可变字符序列来动态地扩充字符串,那么在C++中我们同样也可以实现一个StringBuilder并且用来提升性能,下面就来详解C++中StringBuilder类的实现及其性能优化
    2016-05-05
  • C++编程中指针的声明与基本使用讲解

    C++编程中指针的声明与基本使用讲解

    这篇文章主要介绍了详解C++编程中C++编程中指针的声明与基本使用讲解,文中举了简单的例子来讲如何在基本的数据结构中使用指针,以及固定和可变指针的介绍,需要的朋友可以参考下
    2016-01-01
  • C语言 位运算详解及示例代码

    C语言 位运算详解及示例代码

    本文主要介绍C语言 位运算的基础知识,这里整理了相关资料及示例代码,有兴趣的小伙伴可以参考下
    2016-08-08
  • C语言实现商品管理系统开发

    C语言实现商品管理系统开发

    这篇文章主要为大家详细介绍了C语言实现商品管理系统开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论