c++程序:n个小孩排一圈,从1开始报数,3的倍数出列,循环到结束,输出小孩出列顺序

c++程序:n个小孩排一圈,从1开始报数,3的倍数出列,循环到结束,输出小孩出列顺序,第1张

这是我的程序,如下:

#include<iostream>

using namespace std;

void main()

{

int i,j,t,n;

cout<<"输入人数:"<<endl;

cin>>n;

int child=new int[n];

for(i=0;i!=n;++i)

child[i]=i+1;

t=n;

j=1;

while(t>0)

{

for(i=0;i!=n;++i)

{

if(child[i]!=0)

{

if(j%3==0)

{

--t;

cout<<child[i]<<" ";

child[i]=0;

}

++j;

}

}

}

cout<<endl;

}

以3人,4人,5人为例,结果如下:

你的程序有问题,目测应该是死循环了。while一直在循环。

你的程序里只有出列的时候n才减一,所以n永远都大于1

你是想只循环一圈就输出结果还是第一圈报完数之后剩下的人继续报数呢?

public static void main(String args[]) {

int n=100;

int count=0;

boolean[] arr=new boolean[n];

for(int i=0;i<=n-1;i++){

arr[i]=true;

}

while(n>1){

for(int i=0;i<=99;i++){//这里不能用n,因为你的n是变化的

if(arr[i]==true){

count++;

if(count==3){

count=0;

arr[i]=false;

}

}

n--;

}

}

for(int i=0;i<=99;i++){//这里不能用n,因为你的n是变化的

if(arr[i]==false){//如果是true的话就是留下的人得脚标

Systemoutprintln(i);//输出出列人的脚标,要是输出序号的话就+1

}

}

}

这是一个约瑟夫环的问题

解答如下:

依据提议,可以将题目等价变换为:“n(n=17)人编号为0到(n-1)围成一圈,0号人开始从0报数,凡是报数为m-1 (m=3)倍数的人离开圈子,继续到一个,问他编号”

一开始的状态

0,1,2,3,4,5 (n-2), (n-1) n个人

第一个人被踢之后 设第一个被踢的人的编号为k, 则 k = m%n-1 当n=17,m=3时,k=2。也就是说编号为2的人离开了圈子

这时候的状态

0, (k-1), (k+1) ,(k+2)(n-2),(n-1) (n-1)个人,当n=17,m=3时: 0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16

将这时候的编号做转换 因为是围城一个圈子,下一个开始数的是(k+1)所以也可以表示为

(k+1),(k+2) (n-2),(n-1),0(k-1) (n-1)个人,当n=17,m=3时: 3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,1

重新编号。得到:

0,1,2,3,4(n-3),(n-2)(n-1)个人 这个时候 ,这里重新构成了一个约瑟夫环。也就是说,这是一个递推的关系。

这里我们进行了重新编号。那么 (n-1)个人和 n个人之间的编号不一样的。但是两者之间有一定的关系,可以冲新编号推导出老的

公式如下: i' = (i+k)%(n-1) 比如,当n=17,m=3时 新的环编号是 (n-2),我要求他在老的环中的编号,那么编号是 i' = ( (n-2) + k ) % (n-1) = 17%16 = 1,就是老的换种编号为1的那一个

反过来有 :i = (i'+m)%n

有了上面的推断,可以代码如下:

int ysf(int n,int m){

if(n==1){

return 0; //当环内只有一个人的时候,就是他自己

}

return (ysf(n-1,m) + m ) % n ;

}

------------------完整代码---------------------

public class Test{

public static void main(String[] args){

int a = 17;

int b = 3;

Systemoutprintln(ysf(a,b));

}

static int ysf(int n,int m){

if(n==1){

return 0;

}

return (ysf(n-1,m) +m) % n;

}

}

怎样实现iMessage群发

Apple公司全线在mac os与ios两个 *** 作系统上内置了FaceTime与iMessage两个应用。完美替代运营商的短信与电话。并且FaceTime与iMessage的帐号不仅仅与Apple ID 绑定,同时也与使用这Apple ID的手机号码绑定,这样的漏洞自然给无孔不入的中国的群发垃圾信息商们提供了后门。

这样iPhone的iMessage时不时就能收到以邮件为发送者的垃圾iMessage,尤其是嘀嗒打车群发的最多,听说是厦门一家公司 *** 刀的。针对iMessage的群发实现,新闻稿上说是花几分钟写个脚本就可以了。可惜我花时间研究了好几次,也没有实现大批量群发的实现,倒是把自己的Apple ID搞的电脑与手机不同步了。

我研究怎么实现iMessage群发先是从XMPP协议开始的,因为Apple MAC os上的ichat是XMPP客户端,可以连接iMessage服务器,同时也可连接gtalk与weibo私信。但后面发现iMessage的服务器验证是加密,没办法实现非ichat XMPP客户端连接iMeesage服务器,那就自然没办法实现程序控制往iMeesage服务器批量发送信息。

以上就是关于c++程序:n个小孩排一圈,从1开始报数,3的倍数出列,循环到结束,输出小孩出列顺序全部的内容,包括:c++程序:n个小孩排一圈,从1开始报数,3的倍数出列,循环到结束,输出小孩出列顺序、一个JAVA程序,是圆圈报数逢3退出。为什么我这个没有结果输出。求解答实在没分了谢谢、java编程17人编号为0-16围成一圈,0号人开始从1报数,凡是报数为3倍数的人离开圈子,继续到一个,问他编号等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10143126.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存