2 abuserbig AbuserBIG 于 2016.05.04 16:44 提问

有1到100共100个数, 从1开始, 每隔1, 2, 3... 个数拿走一个数, 最后剩下几?

有1到100共100个数, 从1开始, 每隔1, 2, 3, 4 ... 个数拿走一个数, 一直循环, 最后剩下几?
就是说, 一开始把 1 拿走, 隔1个数(2), 把3拿走, 再隔2个数(4, 5), 把6拿走, 再隔3个数(7, 8, 9)把10拿走. 数到100之后再返回来从2开始循环, 直到最后剩下1个数为止, 请问最后剩下几? 如果是1到n呢?
请用Java编程解决.
求大神帮忙

4个回答

lp897225636
lp897225636   2016.05.04 18:14
public static void compute(int n) {
    ArrayList<Integer> number = new ArrayList<>();
    for (int i = 1; i <= n; i++) {
        number.add(i);
    }
    while (number.size() > 1) {
        int index = 0;
        int count = 0;
        while (index < number.size()) {
            number.remove(index);
            count++;
            index = count * (count + 1) / 2;
        }
    }
}

AbuserBIG
AbuserBIG 您没看明白要求吧, 我自己搞出来了. 总之还是谢谢了
大约 2 年之前 回复
lp897225636
lp897225636   2016.05.04 18:14
    public static void compute(int n) {
        ArrayList<Integer> number = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            number.add(i);
        }
        while (number.size() > 1) {
            int index = 0;
            int count = 0;
            while (index < number.size()) {
                number.remove(index);
                count++;
                index = count * (count + 1) / 2;
            }
        }
    }
qinjisheng_11
qinjisheng_11   2016.05.05 01:12

public class Person {
    private int id;
    private boolean live;

    public Person(int id, boolean live) {
        this.id = id;
        this.live = live;
    }

    public boolean isLive() {
        return live;
    }

    public void setLive(boolean live) {
        this.live = live;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

}
 import java.util.ArrayList;
import java.util.List;

public class CountNumber {
    public static final int NUMBER = 100;

    List<Person> persons = new ArrayList<Person>();

    public static void main(String[] args) {
        CountNumber cn = new CountNumber();
        cn.add();
        cn.deals();
    }

    public void deals() {
        while (persons.size() != 1) {
            deal();
        }
        System.out.println("最后留下的数字是:" + persons.get(0).getId());
    }

    public void deal() {
        int count = 1;// 计数器
        int index = 0;// 指示器

        while (index < persons.size()) {
            persons.get(index).setLive(false);
            count++;
            index += count;
        }

        for (int i = 0; i < persons.size(); i++) {
            if (persons.get(i).isLive() == false) {
                persons.remove(i);
            }
        }
    }

    public void add() {
        for (int i = 1; i < NUMBER+1; i++) {
            Person p = new Person(i, true);
            persons.add(p);
        }
    }
}

自己写的,只是测试3个数,6个数的情况,其他没有测试,所以不保证对,参考下,最后的输出为94(100个数)

AbuserBIG
AbuserBIG 可能我说的不明白, 100数相当于摆成一个圈, 数到100之后接着从2开始数, 并不是说新的循环开始之前数到就不算了. 我自己搞了一早上搞出来了, 总之还是谢谢了.
大约 2 年之前 回复
lp897225636
lp897225636 回复有节奏的键盘: 感觉搞得太复杂了
大约 2 年之前 回复
qinjisheng_11
qinjisheng_11 上面的Person.java,下面的CountNumber.java,自己运行没问题
大约 2 年之前 回复
AbuserBIG
AbuserBIG   2016.05.05 14:02

好吧, 如果有人还对这个题有兴趣我就公布一下100个数最后剩下的是31

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
1 -100 100个数组成一个圈, 每隔二个去掉一个数字,这样一直循环,最后剩下哪个数字
package com.sort; import java.util.ArrayList; import java.util.List; public class LastOne { /** * * 1 -100   100个数组成一个圈, 每隔二个去掉一个数字,, * 这样一直循环,最后剩下哪个数字 * @param args */
1到100每次去掉奇数项后剩下的数或每次去掉偶数项后剩下的最后两位数
去掉奇数项:64 第一次去掉奇数后,剩下2、4、6……96、98、100,所有的数字都是2=2^1的整数倍; 第二次去掉奇数项后,剩余的数为4、8 、12、 16……92、96、100,均是4=2^2的整数倍; 第三次去掉奇数项后,剩余的数应为8=2^3的整数倍的偶数,即是8、16、24、32、40、48、56、64、72、80、88、96;第四次去掉奇数项后,剩余的数为16=2^4的整数倍
[练习题] 找出1-100中缺失的两个数
现在有1~100共一百个自然数,已随机放入一个有98个元素的数组a[98].要求写一个尽量简单的方案,找出没有被放入数组的那2个数,并在屏幕上打印这两个数。注意:程序不用实现自然数随机放入数组的过程。
有100个人围成一个圈,从1开始报数,报到14的这个人就要退出, 然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
public class Test { public static void main(String[] args) { // 创建一个ArrayList来存储所有的人对应的数字 ArrayList list = new ArrayList(); // 使用for循环,向集合中添加对应的数字 for (int i = 1; i list.add(i); } // 定义一个
1-100中共有100个数,求其中‘9’出现的次数。例如99中‘9’出现了两次。
C语言练习题目录索引 题目: 1-100中共有100个数,求其中‘9’出现的次数。例如99中‘9’出现了两次。 解题思路:做这道题时算错了好几次,要么是算少了要么就是算多了,所以最后采取逐位来求,先求一个数的十位上有没有‘9’,再看一个数个位上有没有‘9’。 &amp;lt; code &amp;gt; int main() { int number = 0; int tens = 0...
题目:1*2*3*……*100 求结果末尾有多少个零
分析: 一般类似的题目都会蕴含某种规律或简便方法的 阶乘末尾一个零表示一个进位,则相当于乘以10 而10 是由2*5所得,在1~100当中,可以产生10的有:0 2 4 5 6 8 结尾的数字, 显然2是足够的,因为4、6、8当中都含有因子2,所以都可看当是2,那么关键在于5的数量了 那么该问题的实质是要求出1~100含有多少个5 由特殊推广到一般的论证过程可得: 1、 每隔5个,会
已知一个数组int[98],该数组里面存储了0~99共100个数字中的98个,数字不重复,请用算法算出0~99中缺少的2个数字是哪两个?
import java.util.*; /**  * 已知一个数组int[98],该数组里面存储了0~99共100个数字中的98个,数字不重复,请用算法算出0~99中缺少的2个数字是哪两个? 要求:数组自己用程序生成,数值介于0~99,相互之间不重复。  */ public class Test24 { public static void main(String[]
有一百盏灯,全部亮着并且从一到一百进行编号,对每盏灯做如下处理,如果该灯的编号能被1整除则拨一下开关,能被二整除再拨一下,以此类推,直到该灯的编号(不含编号本身)为至,问最后哪几盏灯亮着。
有一百盏灯,全部亮着并且从一到一百进行编号,对每盏灯做如下处理,如果该灯的编号能被1整除则拨一下开关,能被二整除再拨一下,以此类推,直到该灯的编号(不含编号本身)为至,问最后哪几盏灯亮着。
JAVA经典面试题(三)--1~100共一百个自然数,放入一个99个元素的数组a[99],找出没有放入的那个元素
这答题有两个难点,第一个是怎么向有99个元素中插入不重复的1~100的自然数。第二个是程序优化,也就是1~100的自然数之和减去99个数组元素之和就是剩下的那个数。int sumA = (1+100)*50; int sumArr = 0; int[] arr = new int[99]; for (int i = 0; i < 99; i++) {
1到100,放在长度99的数组里,有一个没有在里面,编程找出那个数
利用hashmap,首先将100个数字存入map中,value初始为0;然后遍历数组,找到一个数字,把value更新为1,这样遍历完成后,就找到了那个被遗弃的数字了。 代码如下。 package go.derek; import java.util.*; public class FindNum { public int find(int[] arr){ Map map=new Ha