N个人,每次数到三,减去一个人,重新开始数,到三再退出。问最后一个人几号?
急求答案
呵呵. 好久没写过C了. 自己用LinkedList封装了个循环列表;
[code="java"]
import java.util.*;
public class testArray{
public static void main(String[] args) {
CircleList clist = new CircleList();
clist.add("1");
clist.add("2");
clist.add("3");
clist.add("4");
clist.add("5");
clist.add("6");
clist.add("7");
clist.add("8");
int i = 1;
while(clist.getSize()>1){
while(i<3){
i++;
}
if(i==3){
clist.delCurr();
i = 0;
}
}
System.out.println("最后元素:"+clist.getCurr());
System.out.println("最后长度:"+clist.getSize());
}
}
/**
*循环列表
*/
class CircleList{
private int index = 0;
private List innerList = new LinkedList();
//返回所有
public List getAll(){
return innerList;
}
public int getSize(){
return innerList.size();
}
//获取当前
public String getCurr(){
if(this.index>=this.innerList.size()){
return null;
}else{
return (String)this.innerList.get(this.index);
}
}
//删除当前项
public void delCurr(){
// System.out.println(this.innerList.get(this.index)+" Deleted");
this.innerList.remove(this.index);
if(this.index>0){
this.index --;
}
// System.out.println("this.innerList.size()"+this.innerList.size());
}
//移动到下一项
public String next(){
this.index++;
if(this.index>=this.innerList.size()){
this.index = 0;
}
return (String)this.innerList.get(this.index);
}
//当前项目插入
public String add(String ele ){
this.innerList.add(ele);
return ele;
}
}
[/code]
大哥,数据结构没学过吗?这种问题最好自己想!
如果你是用C语言编程的话,建立一个链表;
计数到3的人就从链表里删除,计数清0,然后再自加,直到链表的长度为1的时候,就是你要的结果了!
只要答案的话,对3取余为最后那个人的号码,留下的人数为n/3 + n%3
我觉得不用数据结构也行啊!
[code="java"]
public class Main {
public static void main(String[] args) {
int num=500,pre=0,counter=0,i=0;
boolean isOut[]=new boolean[num];
while(num!=1){
if(isOut[i]){
i=(i+1)%500;
}else{
counter++;
if(counter==2)pre=i;
if(counter==3){
isOut[i]=true;
num--;
}
if(counter==4) counter=1;
i=(i+1)%500;
}
}
System.out.println("The Last One is:"+(pre+1));
}
}
[/code]
我觉得不用数据结构也行啊!
[code="java"]
稍微改一下!! :wink:
public class Main {
public static void main(String[] args) {
int num=500,pre=0,sum=num,counter=0,i=0;
boolean isOut[]=new boolean[num];
while(sum!=1){
if(isOut[i]){
i=(i+1)%num;
}else{
counter++;
if(counter==2)pre=i;
if(counter==3){
isOut[i]=true;
//System.out.println("Out :"+i);
sum--;
}
if(counter==4) counter=1;
i=(i+1)%num;
}
}
System.out.println("The Last One is:"+(pre+1));
}
}
[/code]
思路如下:
1.设一个数组,存放的是,第i+1(从0开始计数)个人是否因数过3而出局,若出局,则设成true,否则就是false
2.pre始终表示最后一个数2的人的序号;sum表示当前未出局的人数(若某个人数3,则此人出局);counter是计数的,只能取值1,2,3;
3.循环控制条件是:是否就剩一个人
4.循环里
如果此人出局,看下一个人;
如果此人未出局,看他数的数是几:若是2,则记下这个人的序号;若是3,则此人出局,并将未出局的人数-1。
这样,pre记录的数肯定是最后一个数2的人的序号(下标从0开始)。