C语言,数组实现约瑟夫环问题(两种方法)
2011-11-16 20:24
816 查看
约瑟夫环问题:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
第一种方法:要求将每次出列的人的序号输出,并输出最后一个出列的人。
代码如下:
运行结果如下,
第二种方法:只要求出最后出列的那个人的位置即可
这种方法利用了约瑟夫环的公式,用到了递归,相对简单。
代码如下,
运行结果如下,
希望对各位有用。
第一种方法:要求将每次出列的人的序号输出,并输出最后一个出列的人。
代码如下:
//c语言用数组实现约瑟夫环 #include<stdio.h> #include<stdlib.h> void main() { int y(int n,int m); int p,q,r; printf("请输入参选人的个数p和开始的位置q:\n"); scanf("%d%d",&p,&q); r=y(p,q); printf("最后那个人的初始位置是:%d\n",r); } int y(int n,int m) { int i,j=0,s=0,l; int *a=(int *)malloc(sizeof(int)); int *b=(int *)malloc(sizeof(int)); for(i=0;i<n;i++) { a[i]=i+1; } a =-1; for(i=0;j!=n;i++) { if(a[i]==-1) i=0; if(a[i]!=0 && a[i]!=-1) s++; if(s==m) { b[j]=a[i]; a[i]=0; j++; s=0; } } for(i=0;i<n;i++) { printf("%5d",b[i]); } printf("\n"); l=b[n-1]; return l; }
运行结果如下,
第二种方法:只要求出最后出列的那个人的位置即可
这种方法利用了约瑟夫环的公式,用到了递归,相对简单。
代码如下,
#include<stdio.h> void main() { int y(int n,int m); int a,b,c; scanf("%d%d",&a,&b); c=y(a,b); printf("最后一个数为:%d\n",c); } int y(int n,int m) { int x; if(n==1) x=1; else { x=(y(n-1,m)+m)%n; if(x==0) x=n; } return x; }
运行结果如下,
希望对各位有用。
相关文章推荐
- 学习笔记之约瑟夫环的两种实现方法(数组&链表)
- n皇后问题的两种递归方法C语言实现
- 约瑟夫环问题(c语言数组实现)
- 学习笔记之约瑟夫环的两种实现方法(数组&链表)
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
- 约瑟夫环问题的两种实现[链表+数组]
- 约瑟夫环问题(数组法)c语言实现
- C语言实现:约瑟夫问题(数组和单链表2种方法)
- C语言实现约瑟夫环,使用循环单链表和循环数组2种方法
- 关于实现引用类型数组去调用引用类的方法的问题的解决
- 算法导论之最大子数组问题 C语言实现
- 前端跨域问题相关知识详解(原生js和jquery两种方法实现jsonp跨域)
- Python实现约瑟夫环问题的方法
- C语言实现最长递增子序列问题的解决方法
- 华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)
- C语言实现之三角形问题(非动态规划方法)
- 用数组实现约瑟夫环问题
- C语言指针实现循环报数问题(简单约瑟夫环问题)
- 实现对多维数组按照某个键值排序的两种方法(array_multisort和array_sort)
- 两种用c语言解决亲密数问题的方法并比较程序运行时间