求一道程序题,用java实现 问题: 有n个盘子,从上到下依次为1,2,3n层叠。把第1个盘子移到第n个盘子的下面,然后扔掉第2个盘子。然后把第3个盘子移到最下面,扔掉第4个盘子。如此进行下去,问最后剩下第几号盘子。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 递归和while循环应该都可以实现吧 对于这倒题,在输入n的时候可以输入固定的2,因为每次扔掉的都是第二个盘子,这样就符合这个题目的条件了,这个题是变相的约瑟夫问题,真正的约瑟夫问题m和n都是不固定的。如果输入m=5,n=2,输出结果如下:-------------------------------程序说明如下:有n个盘子,从上到下依次为1,2,3...n层叠。把第1个盘子移到第n个盘子的下面,然后扔掉第2个盘子。然后把第3个盘子移到最下面,扔掉第4个盘子...如此进行下去,直到剩下最有一个盘子,对已给定的盘子数m,求出扔出盘子的顺序以及最后剩下的盘子的序号请输入盘子的个数:5请输入扔出第几个盘子:2按扔出盘子的次序输出序号:2 4 1 5 3 最后剩下的盘子的序号为:3---------------------------------import java.util.Scanner;public class RingTest{ public static void main(String[] args){ System.out.println("程序说明如下:"); System.out.println("有n个盘子,从上到下依次为1,2,3...n层叠。" + "把第1个盘子移到第n个盘子的下面,然后扔掉第2个盘子。然后把第3个盘子移到最下面,扔掉第4个盘子..." + "如此进行下去,直到剩下最有一个盘子,对已给定的盘子数m,求出扔出盘子的顺序以及最后剩下的盘子的序号"); //提示输入盘子的个数 System.out.println("请输入盘子的个数:"); Scanner sca=new Scanner(System.in); int m=sca.nextInt(); //提示输入要扔掉第几个盘子,这道题是固定的,n=2 System.out.println("请输入扔出第几个盘子:"); int n=sca.nextInt(); System.out.println("按扔出盘子的次序输出序号:"); //创建有m个值的数组 int[] a=new int[m]; int[] b=new int[m]; //初始长度,以后出圈一个,长度就减一 int len=m; //给数组赋值 for(int i=0;i<a.length;i++) a[i]=i+1; //i为元素下表,j代表当前要报的数 int i=0; int j=1; int k=0; while(len>0){ if(a[i%m]>0){ if(j%n==0){//找到要扔出的盘子,并把盘子的个数减一 System.out.print(a[i%m]+" "); b[k] = a[i%m]; k++; a[i%m]=-1; j=1; i++; len--; }else{ i++; j++; } }else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数 i++; } } //最后剩下的盘子序号 System.out.println(""); System.out.println("最后剩下的盘子的序号为:"); System.out.println(b[k-1]); }} import java.util.LinkedList;public class Test { private LinkedList<Integer> list = new LinkedList<Integer>(); public Test(int max) { for (int index = 1; index <= max; index++) { list.add(index); } } private void addLast() { list.addLast(list.removeFirst()); list.removeFirst(); } private Integer execute() { while(list.size() > 1) { addLast(); } return list.get(0); } public static void main(String args[]) { System.out.println(new Test(6).execute()); }} 转换为二进制处理public class Jussefu { public static void main(String[] args) { Jussefu jsf=new Jussefu(); jsf.finddisk(14); } public void finddisk(int n){ int m=n; int[] t={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; for(int i=0;i<16;i++){ if(m%2==0){ t[15-i]=0; } else t[15-i]=1; m=m/2; } for(int j=0;j<16;j++){ System.out.print(t[j]); } System.out.println(); for(int j=0;j<16;j++){ if(t[j]==1){ for(int k=j;k<15;k++){ t[k]=t[k+1]; } t[15]=1; break; } } for(int j=0;j<16;j++){ System.out.print(t[j]); } }} package Lession_Two;import java.util.List;import java.util.ArrayList;public class PanZi { List<String> ar=new ArrayList<String>(); private int j=0; public void array(int n){ for(int i=1;i<=n;i++){ ar.add(i+""); } for(int i=0;i<=ar.size()-1;i++){ if((2*j+1)>ar.size()-1){ break; } String str=ar.get(2*j); ar.add(str); ar.remove(2*j); ar.remove(2*j+1); } for(String s : ar){ System.out.println("剩余的盘子编号为:ar["+(100-n)+"]="+s); n--; } } public static void main(String[] args) { PanZi pz=new PanZi(); pz.array(100); }} 貌似不是递归或者什么约瑟夫问题:下标一直在动:比如:1,2,3,4,5 五个盘子//先1和21,2,3,4,5 2,3,4,5,12,4,5,1//在3 和 42,4,5,1 //未动时 的剩余盘子排列2,4,1,5 2,4,1 //在5和6越界!the answer is 2,4,1 关于paint()、画图的一个问题 多线程,求优化 js 放大镜效果 现在很苦恼,大家说说自己的经验,如果自如控制窗口上众品的组件。流布局也不是很好。 java 中有没有类的类概念.就象Delphi 中的 TClass 怎样把JMF也打包进JAR? 加急快信~~~~~~~~~~数组问题,望高手指点!~~ Jdk 1.5和Jdk 5.0有什么区别啊? 非常奇怪的问题,高手请做答! 求救!远程连接服务器的问题,高分相送。在线等待。 socket服务器端线程卡死 servlet文件中含有自定义包应该怎样编译?
-------------------------------
程序说明如下:
有n个盘子,从上到下依次为1,2,3...n层叠。把第1个盘子移到第n个盘子的下面,然后扔掉第2个盘子。然后把第3个盘子移到最下面,扔掉第4个盘子...如此进行下去,直到剩下最有一个盘子,对已给定的盘子数m,求出扔出盘子的顺序以及最后剩下的盘子的序号
请输入盘子的个数:
5
请输入扔出第几个盘子:
2
按扔出盘子的次序输出序号:
2 4 1 5 3
最后剩下的盘子的序号为:
3
---------------------------------
import java.util.Scanner;
public class RingTest{
public static void main(String[] args){
System.out.println("程序说明如下:");
System.out.println("有n个盘子,从上到下依次为1,2,3...n层叠。" +
"把第1个盘子移到第n个盘子的下面,然后扔掉第2个盘子。然后把第3个盘子移到最下面,扔掉第4个盘子..." +
"如此进行下去,直到剩下最有一个盘子,对已给定的盘子数m,求出扔出盘子的顺序以及最后剩下的盘子的序号");
//提示输入盘子的个数
System.out.println("请输入盘子的个数:");
Scanner sca=new Scanner(System.in);
int m=sca.nextInt();
//提示输入要扔掉第几个盘子,这道题是固定的,n=2
System.out.println("请输入扔出第几个盘子:");
int n=sca.nextInt();
System.out.println("按扔出盘子的次序输出序号:");
//创建有m个值的数组
int[] a=new int[m];
int[] b=new int[m];
//初始长度,以后出圈一个,长度就减一
int len=m;
//给数组赋值
for(int i=0;i<a.length;i++)
a[i]=i+1;
//i为元素下表,j代表当前要报的数
int i=0;
int j=1;
int k=0;
while(len>0){
if(a[i%m]>0){
if(j%n==0){//找到要扔出的盘子,并把盘子的个数减一
System.out.print(a[i%m]+" ");
b[k] = a[i%m];
k++;
a[i%m]=-1;
j=1;
i++;
len--;
}else{
i++;
j++;
}
}else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
i++;
}
}
//最后剩下的盘子序号
System.out.println("");
System.out.println("最后剩下的盘子的序号为:");
System.out.println(b[k-1]);
}
}
import java.util.LinkedList;public class Test {
private LinkedList<Integer> list = new LinkedList<Integer>();
public Test(int max) {
for (int index = 1; index <= max; index++) {
list.add(index);
}
}
private void addLast() {
list.addLast(list.removeFirst());
list.removeFirst();
}
private Integer execute() {
while(list.size() > 1) {
addLast();
}
return list.get(0);
}
public static void main(String args[]) {
System.out.println(new Test(6).execute());
}
}
public class Jussefu { public static void main(String[] args) {
Jussefu jsf=new Jussefu();
jsf.finddisk(14);
}
public void finddisk(int n){
int m=n;
int[] t={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
for(int i=0;i<16;i++){
if(m%2==0){
t[15-i]=0;
}
else t[15-i]=1;
m=m/2;
}
for(int j=0;j<16;j++){
System.out.print(t[j]);
}
System.out.println();
for(int j=0;j<16;j++){
if(t[j]==1){
for(int k=j;k<15;k++){
t[k]=t[k+1];
}
t[15]=1;
break;
}
}
for(int j=0;j<16;j++){
System.out.print(t[j]);
}
}
}
import java.util.List;
import java.util.ArrayList;
public class PanZi {
List<String> ar=new ArrayList<String>();
private int j=0;
public void array(int n){
for(int i=1;i<=n;i++){
ar.add(i+"");
}
for(int i=0;i<=ar.size()-1;i++){
if((2*j+1)>ar.size()-1){
break;
}
String str=ar.get(2*j);
ar.add(str);
ar.remove(2*j);
ar.remove(2*j+1);
}
for(String s : ar){
System.out.println("剩余的盘子编号为:ar["+(100-n)+"]="+s);
n--;
}
}
public static void main(String[] args) {
PanZi pz=new PanZi();
pz.array(100);
}}
下标一直在动:
比如:1,2,3,4,5 五个盘子//先1和2
1,2,3,4,5
2,3,4,5,1
2,4,5,1//在3 和 4
2,4,5,1 //未动时 的剩余盘子排列
2,4,1,5
2,4,1 //在5和6
越界!
the answer is 2,4,1