题目如下:
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。 共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。 Sample Input
2
20
40Sample Output
1 7 19
1 19 37我刚学这个不久,对于这个题目感觉很烦恼啊,求高手告诉我该如何做,最好赋予代码
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。 共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。 Sample Input
2
20
40Sample Output
1 7 19
1 19 37我刚学这个不久,对于这个题目感觉很烦恼啊,求高手告诉我该如何做,最好赋予代码
Scanner scanner = new Scanner(System.in);
int count = scanner.nextInt();
List<Integer> inputs = new ArrayList<Integer>(count);
for(int i = 0; i < count; i++)
inputs.add(scanner.nextInt());
for(Integer num : inputs) {
int remain = num;
int[] soldiers = new int[remain];
for(int i = 0; i < remain; i++)
soldiers[i] = i + 1;
while(remain > 3) {
remain -= removeSoldiers(soldiers, 2, remain);
if(remain <= 3)
break;
remain -= removeSoldiers(soldiers, 3, remain);
}
for(int i = 0; i < remain; i++)
System.out.print(soldiers[i] + "\t");
System.out.println();
}
} private static int removeSoldiers(int[] soldiers, int count, int remain) {
int left = count - 1;
int right = count - 1;
int removed = 0;
while(right < remain) {
for(int i = 0; i < count - 1 && right + 1 + i < remain; i++)
soldiers[left + i] = soldiers[right + 1 + i];
left += count - 1;
right += count;
removed++;
}
return removed;
}
public static void main(String[] args) {
final int NUM = 100; //NUM代表士兵的个数
int[] a = new int[NUM];
for (int i = 0; i < NUM; i++) { //初始化士兵数组
a[i] = i + 1;
}
int temp = NUM; //temp存储当前剩余士兵的人数
int i = 0;
int j = 0;
int k = 0;
while (temp > 3) { //剩余士兵数大于3个时按照规则进行
for (i = 0, j = 0; i < temp; i = i + 2, j++) { //按照数1,2的规则,将数1的士兵保存下来
a[j] = a[i]; }
temp = j; //剩余士兵的个数
for (k = 0; k < temp; k++) { //输出本轮剩余士兵的编号
System.out.print(a[k] + " ");
}
System.out.println();
if (temp < 4) { //当剩余的士兵数小于4个时 输出剩余的士兵编号 并且退出
for (k = 0; k < temp; k++) {
System.out.println(a[k]);
}
break;
}
for (i = 0, j = 0; i < temp; i = i + 3, j++) {//按照数1,2,3的规则,将数1的士兵保存下来
a[j] = a[i]; }
temp = j; //剩余士兵的个数
for (k = 0; k < temp; k++) { //输出本轮剩余士兵的编号
System.out.print(a[k] + " ");
}
System.out.println();
if (temp < 4) { //当剩余的士兵数小于4个时 输出剩余的士兵编号 并且退出
System.out.print("最终结果为:" + '\n');
for (k = 0; k < temp; k++) {
System.out.print(a[k] + " ");
}
break;
}
}
}
}
没有按照楼主的规则写,但是稍微改造一下即可~~~
public static void main(String[] args) {
final int NUM = 100; //NUM代表士兵的个数
int[] a = new int[NUM];
for (int i = 0; i < NUM; i++) { //初始化士兵数组
a[i] = i + 1;
}
int temp = NUM; //temp存储当前剩余士兵的人数
int i = 0;
int j = 0;
int k = 0;
while (temp > 3) { //剩余士兵数大于3个时按照规则进行
for (i = 0, j = 0; i < temp; i = i + 2, j++) { //按照数1,2的规则,将数1的士兵保存下来
a[j] = a[i]; }
temp = j; //剩余士兵的个数
for (k = 0; k < temp; k++) { //输出本轮剩余士兵的编号
System.out.print(a[k] + " ");
}
System.out.println();
if (temp < 4) { //当剩余的士兵数小于4个时 输出剩余的士兵编号 并且退出
for (k = 0; k < temp; k++) {
System.out.print(a[k]+" ");
}
break;
}
for (i = 0, j = 0; i < temp; i = i + 3, j++) {//按照数1,2,3的规则,将数1的士兵保存下来
a[j] = a[i]; }
temp = j; //剩余士兵的个数
for (k = 0; k < temp; k++) { //输出本轮剩余士兵的编号
System.out.print(a[k] + " ");
}
System.out.println();
if (temp < 4) { //当剩余的士兵数小于4个时 输出剩余的士兵编号 并且退出
System.out.print("最终结果为:" + '\n');
for (k = 0; k < temp; k++) {
System.out.print(a[k] + " ");
}
break;
}
}
}
}
那个List<Integer> ....是泛化么? 这样有什么好处额。也谢谢4楼的,你的算法对于现在的我刚好看得懂,我修改下应该能用