找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1681|回复: 1

josephus数小孩问题

[复制链接]
发表于 2009-10-31 01:04:10 | 显示全部楼层 |阅读模式 IP:江苏扬州
有m个小孩围成一圈,每数n个小孩,该小孩离开,问最后剩下第几个小孩? 在运行时确定小孩数(用new和delete操作府),并输入检查:小孩数不能小于1,数小孩的间隔数不能小于1,大于小孩数.发现错误让其选择:停止运行,重输,一默认值10和3运行. 我的程序通过了编译但运行不对,帮我看一下哪里错了 #include <iostream.h> main() { int num; //小孩总数 int interval; //数小孩的间隔数 cout <<"please input the interval and num:" <<endl; cin >>interval >>num; int * a=new int[num]; //分配堆空间 for (int r=0;r<num;r++) *(a+r)=r+1; //小孩编号 while(num<1 || interval<1 || interval>num) //输入错误时 { int p; do { cout <<"error--please select:" <<"1or2or3"<<endl <<"1:exit" <<endl <<"2:input again" <<endl <<"3:num=10 and interval=3" <<endl; cin >>p; }while(p!=1 || p!=2 || p!=3); //三种选择 switch(p) { case 1:return false; //停止运行不知怎么表示,这里用的不知对否? case 2:; //空语句,让它自己循环 case 3:const num=10,interval=3;break; } } for(int q=0;q<num;q++) cout <<*(a+q) <<","; //输出开始时的小孩编号 cout <<endl; int k=1; //标识处理第k个小孩离开 int i=-1; //数组下标(下一个值0就是第一个小孩的下标) while(1) { for(int j=0;j<interval;) { i=(i+1)%num; //对下标加1求模 if(a[i]!=0) //判断小孩是否已离开,0为离开 j++; } if(k==num)break; //判断是否只剩一个小孩了
cout <<a[i] <<","; //输出离开的小孩编号 a[i]=0; //标识该小孩已离开 k++; //处理下一圈小孩 delete[]a; } cout <<"\nNo." <<*(a+i) <<"boy's won.\n"; //输出胜利者 }
发表于 2009-10-31 01:04:11 | 显示全部楼层 IP:江苏扬州
上面的程序我没试过,不过我自己重新写了一个程序。如果楼主的题题意我没弄错的话,应该是正确的。
#include <iostream> #include <conio.h> using namespace std;
int main() { int num, interval; cout<<endl; do{ cout<<"please input the interval and num:"; cin>>interval>>num;
int p; if(num<1 || interval<1 || interval>num) do{ cout<<"error--please select:"<<"1or2or3"<<endl <<"1.exit"<<endl <<"2.input again"<<endl <<"3.num=10 and interval=3"<<endl <<"select:"; cin>>p; }while(p!=1 && p!=2 && p!=3);
switch(p){ case 1:return 0; case 2:break; case 3:num=10;interval=3; break; } }while(num<1 || interval<1 || interval>num);
int *child=new int[num]; for(int i=0; i<num; i++) *(child+i)=1;
int count=0; int k=num; int p=-1;
while(k!=1){ count++;
do{ p++; if(p==num) p=0; }while(!child[p]);
if(count==interval){ child[p]=0; cout<<p+1<<' '; count=0; k--; } }
cout<<endl <<"Win:"; for(i=0; i<num; i++) if(child[i]){ cout<<i+1; break; }
cout<<endl <<"Press anykey..."; getch(); delete []child; return 1; }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 13:28 , Processed in 0.229401 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表