约瑟夫环问题(Josephus)
约瑟夫环:用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至最后一个元素并输出该元素的值。
一、循环链表:建立一个有N个元素的循环链表,然后从链表头开始遍历并记数,如果计数值为M,则输出并删除该元素,继续循环(其实是N-1次),当当前元素与下一元素相同时退出循环。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h> typedef struct temp
{
int data;
struct temp *next;
}Node; void JosephRing(int n, int m)
{
//建立约瑟夫环
int i;
Node *head, *p1, *p2; assert(n > 0 && m > 0);
head = (Node *)malloc(sizeof(Node));
head->data = 1; p1 = head;
for (i = 2; i <= n; i++)
{
p2 = (Node *)malloc(sizeof(Node));
p2->data = i;
p1->next = p2;
p1 = p2;
}
p1->next = head;//首尾相连 //循环计数,输出并删除
p2 = head;
while (p2 != p2->next)
{
i = m;
while (--i)
{
p1 = p2;
p2 = p2->next;
} printf("%d ", p2->data);
p1->next = p2->next;
free(p2);
p2 = p1->next;
}
printf("%d\n", p2->data);
free(p2);
}
二、取余操作:令f(n,m)表示n个人玩游戏报m退出最终结果,递推公式:
f(1)=0;
f(n,m)=[f(n-1,m)+m]%n; (n>1)
有了这个公式,我们要做的就是从1~n顺序算出f(n,m)的数值。因为实际生活中编号总是从1开始,我们输出f(n,m)+1。
int Josephus(int n, int m)
{
int i, s = 0;
assert(n > 0 && m > 0);
for (i = 2; i <= n; i++)
s = (s+m)%i;
return s+1;
}
详细分析见:何海涛-圆圈中最后剩下的数字
三、验证程序
int main()
{
int n, m;
scanf("%d%d", &n, &m);
JosephRing(n, m);
printf("%d\n", Josephus(n, m));
return 0;
}
约瑟夫环问题(Josephus)的更多相关文章
- 组合数学--约瑟夫环问题 Josephus
约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环. 有n个囚犯站成一个圆圈,准备处决.首先从一个人开始,越过k-2个人(因为第 ...
- 谁能笑到最后,约瑟夫环-Josephus问题求解
一. 简述Josephus问题 N个人站成一环,从1号开始,用刀将环中后面一个人“消灭“”掉,之后再将刀递给下一个人,这样依次处理,最后留下一个幸存者. 二. 求解方法 1. 约瑟夫问题如果使用 ...
- LightOJ - 1179 Josephus Problem(约瑟夫环)
题目链接:https://vjudge.net/contest/28079#problem/G 题目大意:约瑟夫环问题,给你n和k(分别代表总人数和每次要数到k),求最后一个人的位置. 解题思路:因为 ...
- Josephus环的四种解法(约瑟夫环)
约瑟夫环 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个 ...
- 单向环形链表解决约瑟夫环(Josephus)问题
一.约瑟夫环问题 Josephu 问题为:设编号为1,2,- n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那 ...
- 约瑟夫环的java解决
总共3中解决方法,1.数学推导,2.使用ArrayList递归解决,3.使用首位相连的LinkedList解决 import java.util.ArrayList; /** * 约瑟夫环问题 * 需 ...
- 简洁之美 -约瑟夫环的python 解法
问题描述: 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下 ...
- 约瑟夫环 --- 面向对象 --- java代码
约瑟夫环 的 面向对象 解法 罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个 ...
- Roman Roulette(约瑟夫环模拟)
Roman Roulette Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
随机推荐
- 【转】MFC 自定义edit 限制输入十六进制内容 响应复制粘贴全选剪切的功能
参考地址:MFC 自定义edit 限制输入内容 响应复制粘贴全选剪切的功能 Ctrl组合键ASCII码 ^Z代表Ctrl+z ASCII值 控制字符 AS ...
- VIM命令大全(图+文)
在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行.你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format.使 ...
- 关于统一代码规范ResultBean<T>
之前看了一篇文章,是java团长的一篇代码规范的文章,很有启发.统一返回格式确实给开发带来方便和美感, 有时候Colltroller返回String或者什么Map,list什么的,虽然都转成json返 ...
- apache2 执行ab测试
ab命令 1, cd进入目录apache bin目录 2, ·ab -n 5000 -c 200 http://admin.dzj.local/publics/login.html >> ...
- Spring Boot 2 (三):Spring Boot 开源软件都有哪些?
016年 Spring Boot 还没有被广泛使用,在网上查找相关开源软件的时候没有发现几个,到了现在经过2年的发展,很多互联网公司已经将 Spring Boot 搬上了生产,而使用 Spring B ...
- 集训第六周 数学概念与方法 概率 数论 最大公约数 G题
Description There is a hill with n holes around. The holes are signed from 0 to n-1. A rabbit must h ...
- UVa 514 铁轨
题意: #include <bits/stdc++.h> using namespace std; int main() { int n; ]; ; ) { ]) && n ...
- CPLD和FPGA中不同电压的JTAG电路设计注意事项
在初次的cpld电路设计的时候,遇到了这样的一个问题,整个系统是3.3V的系统,选用的cpld是XC9536-10VQ44C,芯片供电电压5V.他的io可以配置成3.3V和5V两种形式,因此,选用的时 ...
- STM32F407 新建基于固件库的项目模板
1.新建文件夹如图: 2.新建项目在USER文件夹中,选cpu如图: 若再弹出窗口, 直接点cancel 3.删了这俩文件夹: 4.复制文件到fwlib: src 存放的是固件库的.c 文件, inc ...
- xtu summer individual-4 D - Martian Strings
Martian Strings Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...