大家帮我看看这段代码是怎么回事!

中华神鸟 2012-03-13 08:58:20

/**
题目:一个有n人的队列站成一排,依次报数,报3的人出列,下一位继续从1开始报数,报3的出去……
报完后再从头接着报,直到最后剩一个人,编程找出最后一个人原来排第几位。
*/
class Example_1
{
public static int find(int n)//n为队列的总人数
{
int []sequence = new int[n];//定义一个数组用来存放队列中人物所对应的编号
for(int q = 1; q <= n; q++)
{
sequence[q - 1] = q;//为队列中的每一个人按位置编号
}

int j = 2;//用j来记录每一轮出列的第一个人所在数组元素的下标
int i = j;
while(n > 1)//一直循环到最后一个人
{
for(i = j; i < n; i += 2)
{//这里步长设为2而不设为3是因为每次删除一个元素后数组整体前移一位,原来的下一位成了现在的当前位
for(int k = i; k < n - 1; k++)
{
sequence[i] = sequence[i + 1];//删除下标为i的数组元素
}
n -= 1;//删除后数组长度减1
}
j = i - n;//计算下一轮第一个要删除的人所在数组元素的下标
}

return sequence[0];//返回最后一个人原来的位置
}

public static void main(String[] args)
{
System.out.println(find(12));
}
}//未调试成功,与预期值不符(8以及大于10的值不相同)

为什么数字较小时正常,稍大一点就不行了呢?
...全文
277 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
中华神鸟 2012-03-17
  • 打赏
  • 举报
回复
呵呵,是啊,但愿意你懂得!嘿嘿
wanxiangooo 2012-03-16
  • 打赏
  • 举报
回复
n -= 1;//删除后数组长度减1
数组长度不会减1
中华神鸟 2012-03-16
  • 打赏
  • 举报
回复
呵呵呵,我拷下来看看!
Quester-King 2012-03-16
  • 打赏
  • 举报
回复
/* 【程序37】
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
*/
import java.util.Scanner;

public class Cx37 {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入n的值: ");
int n = sc.nextInt();
int[] array = new int[n];
int[] array2 = new int[array.length];
for (int i = 0; i < n; i++) {
array[i] = i + 1;
}
int i = 0;
boolean done = false, donerank = false;
while (array.length > 1) {
i += 3;
while ((i - 1) >= array.length) {
donerank = false;
if (done == true) { // 建立新数组,整理元素
array2 = new int[array.length];
for (int j = 0; j < array.length; j++) { // 复制原array数组
array2[j] = array[j];
}
int num = 0;
for (int j = 0; j < array.length; j++) { // 计算应该减去多少个元素
if (array[j] == 0) {
num++;
}
}
array = new int[array.length - num];
int l = 0;
for (int j = 0; j < array.length; j++) { // 为新数组array赋值
while (array2[l] == 0) {
l++;
}
array[j] = array2[l];
l++;
}
i = i - array2.length;
done = false;
donerank = true;
}
if (donerank == false)
i = i - array.length;
}
if (array.length > 1) {
array[i - 1] = 0;
done = true;
}
}
System.out.println("最后剩下: " + array[0] + " 号.");

}

}


这是我第一次做这个题写的。可读性很差,一样的题目
Vension_NE 2012-03-15
  • 打赏
  • 举报
回复
太强大了,都看不懂啊
中华神鸟 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 vension_nn 的回复:]

太强大了,都看不懂啊
[/Quote]
不是吧,我也是初学者哦!
中华神鸟 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 shenjiao080601 的回复:]

引用 9 楼 duo935658701 的回复:
五楼:好像这个数组没用吧!int[] arr = new int[num];

有啊,给这几个人初始化编号啊
[/Quote]
嗯,有道理,不过去了也可正常使用哦!
shenjiao080601 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 duo935658701 的回复:]
五楼:好像这个数组没用吧!int[] arr = new int[num];
[/Quote]
有啊,给这几个人初始化编号啊
shenjiao080601 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 duo935658701 的回复:]
五楼:好像这个数组没用吧!int[] arr = new int[num];
[/Quote]
怎么能没用,你总得给这几个人初始化编号吧,1,2,3,4.。。。是不?
传说中的大神 2012-03-14
  • 打赏
  • 举报
回复
第二个人 永远都是.
传说中的大神 2012-03-14
  • 打赏
  • 举报
回复
算法错误.
中华神鸟 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nmyangym 的回复:]

不太明白楼主的意思.
[/Quote]
就是这段代码输出的结果与预期应该出的结果不一样!
中华神鸟 2012-03-14
  • 打赏
  • 举报
回复
五楼:好像这个数组没用吧!int[] arr = new int[num];
中华神鸟 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shenjiao080601 的回复:]

这是我写的,你可以参考下:
package com.xinzhan.test;

import java.util.Scanner;

public class TestThree {
public static void main(String[] args) {
System.out.println("请输入游戏总人数");
Scanner input = new Scann……
[/Quote]
刚才调试了一下,阁下的这段代码完全可以正常执行,拷下来好好学习了!
studykeep 2012-03-14
  • 打赏
  • 举报
回复
用队列更好!
中华神鸟 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 opqm2009 的回复:]

楼主确定数字小时也正常吗,在我看来不可能正常.楼主应该是眼花了把,把sequence[i] = sequence[i + 1]换成sequence[k] = sequence[k + 1]试试。
要不是眼花你可以想想,要是i,那么第二个for循环就毫无意义了,循环(n-1-1-2+1)次在做同样的事情,因此很显然不是i而是k,没有太深入的研究这个问题,只是看过你的代码后发现这个问题,在结合几个……
[/Quote]
谢谢你哦,按你的方法改了以后真的好了!呵呵
shenjiao080601 2012-03-14
  • 打赏
  • 举报
回复
这是我写的,你可以参考下:
package com.xinzhan.test;

import java.util.Scanner;

public class TestThree {
public static void main(String[] args) {
System.out.println("请输入游戏总人数");
Scanner input = new Scanner(System.in);
int num=input.nextInt();
new TestThree().test(num);
}
public void test(int num){
int count=0;//计数器,当满3时,清零
int number=0;//flag为零计数器
int[] arr = new int[num];
int[] flag = new int[num];
//赋初始值
for(int i=0;i<num;i++){
arr[i]=i+1;
flag[i]=1;
}
//当flag中还有一个为1时,停止循环
while(num-number>1){
for(int i=0;i<num;i++){
if(flag[i]!=0){
count++;
}
if(count==3){
flag[i]=0;
count=0;
number++;
}
}
}
//打印出结果
for(int i=0;i<num;i++){
if(flag[i]==1){
System.out.println("最后一个人的留的人的原始序号为:"+(i+1));
}
}
}
}
Robbie枫叶EX 2012-03-14
  • 打赏
  • 举报
回复
楼主确定数字小时也正常吗,在我看来不可能正常.楼主应该是眼花了把,把sequence[i] = sequence[i + 1]换成sequence[k] = sequence[k + 1]试试。
要不是眼花你可以想想,要是i,那么第二个for循环就毫无意义了,循环(n-1-1-2+1)次在做同样的事情,因此很显然不是i而是k,没有太深入的研究这个问题,只是看过你的代码后发现这个问题,在结合几个示例运行后都是正确的,所以问题应该是出在这。比如,n = 12,输出10; n = 13,输出13; n = 14,输出2;这和笔算的是一致的.
nmyangym 2012-03-13
  • 打赏
  • 举报
回复
不太明白楼主的意思.

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧