永发信息网

求:约瑟夫环(带路径) C语言程序

答案:2  悬赏:70  手机版
解决时间 2021-04-23 05:07

求:约瑟夫环(带路径) C语言程序

注意了:我需要的是时间复杂度为O(n)的程序 , 非O(n*m)

是一个数学的应用问题:

 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

例如:输入:n k m

输出 n个数 依次出列的编号
简单样例:9 1 5

  5 1 7 4 3 6 9 2 8

最佳答案

如果是要O(n)的复杂度的话,那么直接使用数学解法得到递推公式:


令f[i]表示i个人报m退出最后留下者的编号,求f[n]


递推公式:
f[1]=0;
f[i]=(f[i-1]+m)%i; (i>1)


你这题多了一个起始偏移量k,那么就再变换一下,将f[n]的值变为 (f[n] - k ) % n就可以了。

全部回答
#include<stdio.h> main() { int n,k,m,i,h,a[],b[],c[]; n=scanf("%f",&f); k=scanf("%f",&f); m=scanf("%f",&f); for(i=1;i<=n;i++) { a[i]=i; } for(i=1;i<=(n-1);i++) { if(n-1>m) {b[i]=a[m]; for(h=1;h<=(m-1);h++) { a[h+n]=a[h]; } for(h=1;h<=(m-1);h++) { a[h]=a[h+m]; } } elseif((n-1)==m) { b[i]=a[m] } else { for(h=1;(n-i+h)<=m;h++) { a[n-i+h]=a[h]; } b[i]=a[m] } } } for(i=1;i<=n;i++) { printf("%c ",b[i]); } }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
DNF拔刀怎么拔两下
霸气徒步横幅标语,徒步夜游搞笑句子
潍坊有哪些购物地方
辽阳站前小庄那老房子里面现在还有服务吗 201
关于收邮件的问题
家富侨地址在哪,我要去那里办事
皮皮播放器 显示盘已满是怎么回事
中国移动通信G3手机专卖店大直永源指定专营店
敬酒怎么说,朋友聚会,饭桌上怎么说祝酒词?
一首韩语歌曲中有一句像傻瓜一样爱你
怎么样维护我和她的爱情啊?
平顶山为什么叫鹰城
如果只有分开才能体会到相聚的快乐,那是不是
有谁知道怎么使得div边框在网页中显示为浅蓝
面试用一句话总结自己,用一句话评价材料三中
推荐资讯
一代明君李世明,治理国家呈繁荣,贫穷腐败要清
怎样活才会不累啊?
控制面板的日期/时间为什么打不开
宁波8月28到9月6的单双号限行是不是外地车也
秦雨婷的英文名是什么?
形容秋天很美的诗句,描写秋天赏心悦目的美的
管氏膏药对使用者有什么副作用吗?
乌镇到苏州汽车多久,从苏州去乌镇怎么走
在太阳系中,离太阳最近的是什么星球其于依次
矢量变频器什么意思,矢量变频器一般用在什么
怎么样才可以让头发长得快
dnf阿修罗怎么加点?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?