黑马程序员技术交流社区
标题:
心血来潮写个活动贴的问题还写出问题来了....
[打印本页]
作者:
宋超2356
时间:
2014-4-30 17:55
标题:
心血来潮写个活动贴的问题还写出问题来了....
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。就是这个,我如果设置一个死数进去没什么问题,如果在加上IO就....各种不对,帮忙看下~
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Test {
public static void main(String[] args) throws IOException {
System.out.println("请输入要多少个人");
DataInputStream bufr = new DataInputStream(System.in);
int num = bufr.read() ;
final int flag = 3;
List<Integer> mans = new ArrayList<Integer>();
for (int i = 0; i < num; i++) {
mans.add(i + 1);
}
System.out.println("有" + mans + mans.size() + "个人围成一圈");
ListIterator<Integer> iter = null;
int k = 1;
do {
iter = mans.listIterator();
while (iter.hasNext()) {
int i = iter.next();
if (k++ % flag == 0) {
System.out.println("编号" + i + "的人退出圈子");
iter.remove();
k = 1;
}
}
} while (mans.size() > 1);
System.out.println("剩下编号为" + mans + "的" + mans.size() + "个人");
}
}
复制代码
哪里错了
作者:
水竹
时间:
2014-4-30 18:18
那个num接收的值就错了。
类型转换的问题吧,输入1的话赋的值是49,是字符‘1’的值。
我把第13行改成
int num = bufr.read()-49 ;
复制代码
之后试了一下,结果就对了。
这种错误在Eclipse里面debug一下就看出来了吧。
作者:
xtxiaolu
时间:
2014-4-30 21:57
本帖最后由 xtxiaolu 于 2014-4-30 21:59 编辑
public static void main(String[] args) {
int luckly = getluckly(100);
System.out.println("剩下的人是第:" + luckly + "个人");
}
public static int getluckly(int num) {
List<Integer> list = new LinkedList<>(); // 定义一个集合因为LinkedList查找快所以用它
for (int i = 1; i <= num; i++) { // 遍历每个元素
list.add(i); // 把元素封装到list.add(i);中
}
int count = 1; // 定义一个计数的
for (int i = 0; list.size() != 1; i++) { // 遍历集合只要集合中的元素不为1,就不断的循环
if (i == list.size()) { // 当i自增到集合中元素的个数是
i = 0; // 就将i重新置为0
}
if (count % 3 == 0) { // 只要查找到了3的倍数是就从集合中删掉
list.remove(i--); // 删除的时候要索引--
}
count++; // 查数递增
}
return list.get(0); // 最后集合中只要有一个元素就是哪个幸运的
}
复制代码
作者:
来男.
时间:
2014-5-4 01:19
我也写了个,感觉挺好理解。
package cn.itcast.day2;
import java.util.*;
/*题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),
凡报到3的人退出圈子,问最后留下的是原来第几号的那位。*/
public class WuYi2 {
public static void main(String[] args) {
System.out.println("请输入参加人数:");
//引入扫描器
Scanner input=new Scanner(System.in);
int person=input.nextInt();
//建个boolean类型数组,判断人进出的情况
boolean[] flag=new boolean[person];
for (int i = 0; i < flag.length; i++) {
//将所有都标记成圈内人
flag[i]=true;
}
//依次初始化参加人数、报号数和变化标记
int count=person,number=0,index=0;
//人数必须大于1,基数最少为2
while(count>1){
//从第一个人开始报
if(flag[index]){
//报号数每次增1
number++;
//当报号数为3时
if(number==3){
//当前的人出去
flag[index]=false;
//报号数清零
number=0;
//人数减1
count--;
}
}
index++;
//当索引为数组长度时,取不到人了,数组下标越界,Index归零
if(index==person){
index=0;
}
}
//遍历数组,此时只剩1人
for (int j = 0; j < person; j++) {
if(flag[j]){
System.out.println("原始的数是:"+(j+1));
}
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2