约瑟夫环问题,用C语言编写

设N个人围坐一圈,并按顺时针方向1-N编号,从s个人开始报数,报到第m个人,此人出圈,后面的人继续从1到m报数,直到最后一个人,

数学原理:http://zh.wikipedia.org/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98

有递归和迭代两个程序,选一个即可。

#include <stdio.h>

int Josephus2(int n, int k) {
if (n == 1) return 0;
return (Josephus2(n - 1, k) + k ) % n;
}

int Josephus(int n, int m) {
int i, x = 0;
for (i = 1; i <= n; ++i) {
x = (x + m) % i;
}
return x;
}

int main() {

int n, m, s;

scanf("%d%d%d", &n, &s, &m)

printf("%d\n", Josephus(n, m) + s);
//printf("%d\n", Josephus2(n, m) + s);
return 0;
}

追问

scanf后面少了一个分号

追答

估计完全用C的环境吧

#include <stdio.h>

int Josephus(int n, int m) {
int i, x = 0;
for (i = 1; i <= n; ++i) {
x = (x + m) % i;
}
return x;
}

int main() {

int n, m, s;

scanf("%d%d%d", &n, &s, &m);

printf("%d\n", Josephus(n, m) + s);
return 0;
}

温馨提示:内容为网友见解,仅供参考
无其他回答

数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来完成链表该完成的功能,虽然形式上完全不相同,但却求出了 相同的结果.有异曲同工之妙.总之我个人认为是数组中非常经典的算法了.希望本 ...

约瑟夫环(单向循环链表)_C语言「抄作业」
示例输出 在C语言抄作业系列中,提供了关于约瑟夫环问题的代码实现。该实现旨在解决Josephus与另一人最初位次的计算问题。作为一个计算机科学专业毕业多年后转行至产品经理的人,从当年的作业中搜集了这部分代码,供参考。

C语言编程丨循环链表实现约瑟夫环!真可谓无所不能的C!
通过循环链表,可以高效地模拟上述淘汰过程,实现约瑟夫环问题的解决。循环链表在约瑟夫环问题中的应用揭示了其强大的功能,以及在特定场景下的高效解决方案。通过结合循环链表的特性,可以构建出简洁、高效的代码实现。

用C语言解决一个实际问题(不要太长)
约瑟夫环(很有名的数学问题)已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。void JOSEPHUS(int n,int k,int m) \/\/n为总人数,k...

约瑟夫环问题怎么解决啊?请用C语言写代码,谢谢!
include"MyNode.h" \/\/文件1 Node::Node( ){ next = NULL;} Node::Node(Node_entry item, Node *add_on){ entry = item;next = add_on;} --- include<iostream.h> \/\/文件2 typedef int Node_entry;struct Node { \/\/ data members Node_entry entry;Node *next;\/\/ constructor...

用c语言实现约瑟夫环
正好之前写过基础的约瑟夫环,稍作修改就可以满足你的题目 include <stdio.h>#include <stdlib.h>typedef struct _node { int id; int key; struct _node *next;} Linklist;int main() {int n, m;scanf("%d %d", &n, &m);int i, count = 0;Linklist *head = (Linklist*...

C语言约瑟夫环切西瓜问题
x*sizeof(int));while(left<x){ if(0==arr[i])c++;if(y==c){ arr[i]=1;left++;\/\/不需要打印切掉的西瓜的编号的话,\/\/注释掉这句 printf("%d ",i+1);if(left==x)printf("\\n最后留下来的西瓜的编号是:%d",i+1);c=0;} if(++i==x)i=0;} free(arr);return 0;} ...

求助, 约瑟夫环问题(C语言)
\/\/使用q为起始点 do{ i=0;\/\/避免m减一后为零的问题 while(i!=m){ q=q->next;i++;} p=q->next;q->next=p->next;printf(" %d",p->num);m=p->val;\/\/你少了这一步。m=m-1;\/\/提前使q停下,p=q->next,p就是目标。free(p);}while(q->next!=q);printf(" %d\\n",...

C语言,跳不出循环了。帮看看
约瑟夫环问题:处理方法关键是如何实现首位相连。一种思路是链表实现的首尾相连,另一种数组通过数字的调整实现,显然第一种更好。楼主实现的是第二种思路。对你的代码分析如下:首先你的分配序号有点抽象,可改为 for(i=1;i<=n;i++)num[i]=i;include <stdio.h> void main(){ int num[50];...

c语言题目;有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3...
这个问题叫约瑟夫环问题。n个人围成一圈,按顺序编号,分别为1、2、3..n。(你可以理解成每个人的座号)。然后1号开始,每人依次报号。即 (这里假设n=5)(前面是座号、后面是他报的号)1:1 2:2 3:3(退出)现在只剩下座号为1、2、4、5的人,从3的下一个开始报号 4:1 5:2 1:3...

相似回答