/**
题目:一个有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的值不相同)为什么数字较小时正常,稍大一点就不行了呢?
要不是眼花你可以想想,要是i,那么第二个for循环就毫无意义了,循环(n-1-1-2+1)次在做同样的事情,因此很显然不是i而是k,没有太深入的研究这个问题,只是看过你的代码后发现这个问题,在结合几个示例运行后都是正确的,所以问题应该是出在这。比如,n = 12,输出10; n = 13,输出13; n = 14,输出2;这和笔算的是一致的.
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));
}
}
}
}
题目:有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] + " 号."); }}这是我第一次做这个题写的。可读性很差,一样的题目