这是我写的,希望与大家交流下,还有更简单的吗?
//定义变量X,来记录最后100人中剩下人的编号
static int x =0;
//主函数
public static void main(String[] args){
//创建两个ArrayList集合al和newAl,al用来存最开始这100个人的数据,newAl用来存100人中报到14要退出的人数
ArrayList<Integer> al = new ArrayList<Integer>();
ArrayList<Integer> newAl = new ArrayList<Integer>();
//1-100的循环,给al这个集合添加1到100个人的数据
for(int i=1 ;i<101; i++){
al.add(i);
}
//调用能记录满足报到14,就要退出人的编号的方法
newAl = remianPerson();
//移除那些满足条件需要退出的人后就是剩下的人
al.removeAll(newAl);
//通过获取al集合的迭代器,来打印剩余人的编号数据
Iterator<Integer> it = al.iterator();
while(it.hasNext()){
//给剩余人的编号做个序号
x++;
System.out.println("剩余第"+x+"人的编号是:"+it.next());
}
}
//定义方法来获取满足100人中循环报到14要退出的最终人的编号
private static ArrayList<Integer> remianPerson() {
//定义集合来保存满足报到14要退出的人的编号
ArrayList<Integer> rp = new ArrayList<Integer>();
//定义变量count用来记录报数
int count = 0;
//从1-100人之间的循环报数
for(int i=1 ; i<101 ; i++){
count++;
//当集合里记录退出的人编号重复出现时,则忽略当前编号进入下个编号
while(rp.contains(i)){
i++;
//当集合里编号为100的人重复出现时,i会变成101结束,为了让程序能继续循环运行,把i赋值为1在开始
if(i==101)
i=1;
}
//如果报数能余14等于0,说明已经报到14,则集合记录此人编号,在把报数清零,重新记录报数情况
if(count%14==0){
rp.add(i);
count=0;
}
//当for循环走到i等于100时,程序下一步会结束,为了让程序继续走把i赋值为1
if(i==100)
i=1;
//只有当集合中报到14满足条件的人数大于86时,也就是不满足条件剩下的人数小于14,
//不能完成报数条件时才会结束,返回100人中报到14满足条件的所有人编号
if(rp.size()>86)
return rp;
}
//返回结合数据
return rp;
}
|
|