约瑟夫环c言语,问题布景
约瑟夫环问题是一个经典的编程问题,一般描绘为:N个人围成一圈,从榜首个人开端报数,签到M的人出列,然后从下一个人开端继续报数,如此循环,直到所有人都出列。这个问题的处理方案能够有多种,绵亘运用数组、链表等数据结构。
下面是一个运用数组来处理约瑟夫环问题的C言语完成:
```cinclude
void josephus { int people, i, count = 0, index = 0; // 初始化数组 for { people = i 1; } // 循环直到所有人都出列 while { // 报数 for { index = % n; } // 第m个人出列 printfqwe2; people = 0; count ; // 从下一个人开端报数 while == 0qwe2 { index = % n; } } printf;}
int main { int n, m; printf; scanf; printf; scanf; josephus; return 0;}```
这段代码首要界说了一个函数`josephus`来处理约瑟夫环问题。在`main`函数中,用户输入总人数N和报数M,然后调用`josephus`函数来输出出列的次序。在这个完成中,咱们运用了一个数组来模仿环形结构,并经过循环和取模操作来模仿报数和出列的进程。
约瑟夫环问题,又称为丢手绢问题,是一个经典的数学问题,起源于古代犹太历史学家约瑟夫的故事。这个问题在计算机科学、数学、物理等范畴都有广泛的运用。本文将具体介绍约瑟夫环问题的布景、解题思路以及C言语完成办法。
问题布景
约瑟夫环问题起源于一个陈旧的故事:39个犹太人为了逃避罗马人的追捕,躲进了一个山洞。为了保证不被敌人发现,他们决议采纳一种自杀办法,即39个人围成一圈,从榜首个人开端报数,每数到第3个人,该人就必须自杀。这个进程一向继续,直到只剩下一个人停止。约瑟夫和他的朋友不想遵照这个规矩,他们经过奇妙的办法,终究幸存下来。
问题剖析
约瑟夫环问题能够用以下办法描绘:有n个人围成一圈,从榜首个人开端报数,每数到m的人出列,然后从下一个人开端从头报数,直到所有人都出列。咱们需求找出最终留下的是本来第几号的人。
解题思路
处理约瑟夫环问题主要有以下几种办法:
模仿法:经过模仿整个进程,记载每个人的出列次序,最终找到留下的人。
数学法:运用数学公式直接计算出最终留下的人的编号。
循环链表法:运用循环链表模仿围成一圈的人,经过遍历链表来模仿报数和出列进程。
行列法:运用行列来模仿围成一圈的人,经过行列的先进先出特性来模仿报数和出列进程。
C言语完成
以下是一个运用模仿法完成的约瑟夫环问题的C言语程序:
```c
include
include
// 界说一个结构体来表明一个人
typedef struct Person {
int id; // 人的编号
struct Person next; // 指向下一个人的指针
} Person;
// 创立一个包括n个人的环形链表
Person createCircle(int n) {
Person head = NULL, tail = NULL, temp = NULL;
for (int i = 1; i id = i;
temp->next = NULL;
if (head == NULL) {
head = temp;
tail = temp;
} else {
tail->next = temp;
tail = temp;
}
}
tail->next = head; // 构成环形
return head;
// 模仿约瑟夫环问题
int josephus(int n, int m) {
Person head = createCircle(n);
Person current = head;
Person prev = NULL;
while (current->next != current) {
for (int i = 1; i next;
}
prev->next = current->next; // 移除当时节点
free(current);
current = prev->next;
}
int result = current->id;
free(current);
return result;
int main() {
int n, m;
printf(\
相关
-
python调用函数, 函数界说的根本语法详细阅读
当然能够,我能够展现怎么界说和调用一个简略的函数。首要,我会界说一个简略的函数,比方一个加法函数,然后我会调用这个函数。函数界说和调用成功。界说的加法函数`add`将两个数...
2024-12-25 1
-
python是一种,引领编程潮流的强壮言语详细阅读
Python是一种高档编程言语,它以其简练的语法和强壮的功用而出名。它被广泛用于各种范畴,包含数据科学、机器学习、Web开发、自动化等。Python的规划哲学着重代码的可读性和...
2024-12-25 3
-
宝可梦go下载中文版,探究实际国际的奇特之旅详细阅读
你能够经过以下链接下载宝可梦GO中文版:1.精灵宝可梦go手游官方正版下载v0.343.0安卓版2.宝可梦go手游官方版下载v0.343.03.pokem...
2024-12-25 1
-
php优势,PHP言语的优势与特色解析详细阅读
1.跨渠道性:PHP可以在多个操作体系上运转,包含Windows、Linux和macOS。这使得PHP成为一种灵敏的言语,可以满意不同用户的需求。2.易于学习:PHP具有简...
2024-12-25 4
-
c言语动态数组,什么是动态数组详细阅读
在C言语中,动态数组通常是指运用指针和动态内存分配函数(如`malloc`、`calloc`、`realloc`等)在运行时创立的数组。这种数组的巨细能够在程序履行过程中根据需...
2024-12-25 2
-
java工程师,工作概述与岗位职责详细阅读
Java工程师是一个专门从事Java编程言语的软件开发人员。Java是一种广泛运用的编程言语,因其跨渠道性、安全性、可移植性和面向对象的特色而遭到开发者的喜爱。Java工程师担...
2024-12-25 5
-
c言语函数指针, 什么是函数指针详细阅读
在C言语中,函数指针是一个指向函数的指针变量。函数指针能够用来存储函数的地址,并能够像指针相同被传递和调用。函数指针在C言语中有着广泛的运用,比方回调函数、推迟绑定、函数表等。...
2024-12-25 3
-
c言语二维数组,概念、运用与技巧详细阅读
在C言语中,二维数组是一个由一维数组组成的数组。它能够看作是一个矩阵,其间每一行都是一个一维数组。二维数组在C言语中声明和初始化的方法如下:```c//声明一个5行4列的二维...
2024-12-25 4
-
swift下载,什么是 Swift?详细阅读
你能够经过以下几种方法下载Swift编程言语:1.苹果开发者官网:你能够拜访下载Swift6,了解其新功能,观看最新视频,或参与Swift讲座和学习资源。2.Sw...
2024-12-25 4
-
c言语getchar用法,getchar函数的用法详解详细阅读
`getchar`是C言语中的一个函数,用于从规范输入(一般是键盘)读取一个字符。当程序调用`getchar`时,它会等候用户输入一个字符,然后回来该字符的ASCI...
2024-12-25 3