求一道编程题的解答,最好有代码

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开始)。