一道经典的题目(java编写)
来源:互联网 发布:今目标软件下载 编辑:程序博客网 时间:2024/06/04 17:58
//约瑟夫标准循环非递归解法
//500个小孩围成一圈,从第一个开始报数:1,2,3,1,2,3,1,2,3……每次报3的小孩退出,问最后剩下的那个小孩是原来500个小孩中的第几个?
class t33{
public static void main(String[] args){
//递归解法(思路:报数:1,2,3,4,5,6……;每次报到3的倍数的小孩退出)
/* int[] all=new int[500];
for(int i=0;i<all.length;i++){
all[i]=1;//500个小孩未退出者全部赋值为1
}
int sum=0;//共数了多少个数
int s=all.length;//还剩多少个小孩(第一次开始前剩500个)
while(s>1){
s=0;
for(int i=0;i<all.length;i++){
if(all[i]==1){
sum++;
if(sum%3==0){
all[i]=0;//小孩退出后赋值为0
}else{
s++;
}
}
}
}
for(int i=0;i<all.length;i++){
if(all[i]==1){
System.out.print(i+1);
}
} */
//约瑟夫标准循环非递归解法
/* int n=500,m=3,index=0;
for(int i=2;i<=n;i++){
index=(index+m)%i;
}
System.out.println(index+1); */
//约瑟夫标准循环非递归解法详解
/* 思路:总人数为n-1时从第1个开始数剩下的是第s个,总人数增加到n个人(增加1个人到最后):
从第n+(1-3)的位置数,增加的那个人第一个循环就退出了,剩下的还是总人数n-1时剩下的那个人,
开始数的位置提前3个人,即从第1个人开始数的话,最后剩下的是第s+3个人
(3改成别的数字也一样)*/
//定义n为总人数,m为要退出的数字,s为最后剩下的小孩序号(总人数1个人时为1)
int n=500,m=3,s=1;
//从总人数为2开始增加
for(int i=2;i<=n;i++){
s=(s+m-1)%i+1;
//总人数1个人时:s为1
//每增加一个人,s的位置后移m(3),即为s+m的位置
//可能发生溢出,所以增加对i求余
//但又会发生若第i个剩下时,s为0(应为i),所以让(s+m-1)对i求余然后加1,以避免这种情况发生
}
System.out.println(s);
}
}
//500个小孩围成一圈,从第一个开始报数:1,2,3,1,2,3,1,2,3……每次报3的小孩退出,问最后剩下的那个小孩是原来500个小孩中的第几个?
class t33{
public static void main(String[] args){
//递归解法(思路:报数:1,2,3,4,5,6……;每次报到3的倍数的小孩退出)
/* int[] all=new int[500];
for(int i=0;i<all.length;i++){
all[i]=1;//500个小孩未退出者全部赋值为1
}
int sum=0;//共数了多少个数
int s=all.length;//还剩多少个小孩(第一次开始前剩500个)
while(s>1){
s=0;
for(int i=0;i<all.length;i++){
if(all[i]==1){
sum++;
if(sum%3==0){
all[i]=0;//小孩退出后赋值为0
}else{
s++;
}
}
}
}
for(int i=0;i<all.length;i++){
if(all[i]==1){
System.out.print(i+1);
}
} */
//约瑟夫标准循环非递归解法
/* int n=500,m=3,index=0;
for(int i=2;i<=n;i++){
index=(index+m)%i;
}
System.out.println(index+1); */
//约瑟夫标准循环非递归解法详解
/* 思路:总人数为n-1时从第1个开始数剩下的是第s个,总人数增加到n个人(增加1个人到最后):
从第n+(1-3)的位置数,增加的那个人第一个循环就退出了,剩下的还是总人数n-1时剩下的那个人,
开始数的位置提前3个人,即从第1个人开始数的话,最后剩下的是第s+3个人
(3改成别的数字也一样)*/
//定义n为总人数,m为要退出的数字,s为最后剩下的小孩序号(总人数1个人时为1)
int n=500,m=3,s=1;
//从总人数为2开始增加
for(int i=2;i<=n;i++){
s=(s+m-1)%i+1;
//总人数1个人时:s为1
//每增加一个人,s的位置后移m(3),即为s+m的位置
//可能发生溢出,所以增加对i求余
//但又会发生若第i个剩下时,s为0(应为i),所以让(s+m-1)对i求余然后加1,以避免这种情况发生
}
System.out.println(s);
}
}
0 0
- 一道经典的题目(java编写)
- 经典的一道题目.
- js的一道经典题目
- js的一道经典题目
- java 面试中的一道截取字符串的经典题目
- 2015 百度笔试的一道经典题目
- 一道经典题目
- 一道经典的面试题目(寻找1-1000中重复的数字)
- 一道经典的C++结构体的题目
- 一道关于public,private,protected继承的经典题目
- 一道很有意思的JAVA题目
- 一道Java面试题目--对象的构造
- 求助!java当中的一道题目。
- 由一道题目引出的java多态
- 一道Java面试题目
- 一道Java题目
- 一道经典的JAVA面试题
- 一道经典的java面试题分析
- 文件下载
- hdu 1025 dp问题 学习笔记兼解题报告
- jdbc分页查询
- [Xcode]快捷键的使用
- C++类成员初始化总结以及面向对象编程原则
- 一道经典的题目(java编写)
- HTML5的未来
- CentOS下安装和配置MySQL-JDK-Tomcat-Nginx(个人官网环境搭建手册)
- Android Activity间动画跳转
- Java中如何调用WebService
- 上海找酒店小妹电话
- 关于WorkBench6.1-lError Code: 1175.错误
- Java NIO传输(一)
- zoj3329 概率dp求期望