题目如下,要求用java语言编程...
以正整数n,i,k作为输入,其中n,i,k>0,且i<n。假定数1,2,…,n是环形排列的。试编写一个程序,从数i开始,按顺时针方向以k为步长打印数,当打印某个数时,应从环中删去该数,这样的过程一直进行到环空为止。例如,当n=10,i=1,k=3时,得到的输出序列是3,6,9,2,7,1,8,5,10,4。
小弟才疏学浅...
写了个如下方法 后面就不会了
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*
 *  12345678910
n=10 k=3 i=1
1st
369  剩 12457810
2nd
2(10 1后)7(4,5后)1(8,10后) */
public class Subject1 {
public static void main(String[] args){
Scanner inputI = new Scanner(System.in);
Scanner inputN = new Scanner(System.in);
Scanner inputK = new Scanner(System.in); System.out.print("请输入起始数i:");
int i = inputI.nextInt();
System.out.print("请输入结尾数n:");
int n = inputN.nextInt();
System.out.print("请输入步进数k:");
int k = inputK.nextInt();
//两数组用于存储
List<Integer> list = new ArrayList();
List<Integer> list2 = new ArrayList();

//参数j,循环出i至n
for(int j = i;j <= n;i++){
list.add(j++);
}
for(int j=0;j<list.size();j++){
System.out.print(list.get(j) + " ");
}

System.out.println();//行控制

for(int j=0;j<list.size();j++){
//m 转化数组元素
int m = list.get(j);
// System.out.print(m + " ");
if(m%3==0){
list.remove(j);
list2.add(m);
} }

// System.out.println();//行控制
//
for(int j=0;j<list.size();j++){
System.out.print(list.get(j) + " ");
}

System.out.println();//行控制

for(int j=0;j<list2.size();j++){
System.out.print(list2.get(j) + " ");
}
}
}

解决方案 »

  1.   

    package Luzhou;import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    /*
     *  12345678910
    n=10 k=3 i=1
    1st
    369  剩 12457810
    2nd
    2(10 1后)7(4,5后)1(8,10后) */
    public class Subject1 {
    public static void main(String[] args){
    Scanner inputI = new Scanner(System.in);
    Scanner inputN = new Scanner(System.in);
    Scanner inputK = new Scanner(System.in);// System.out.print("请输入起始数i:");
    // int i = inputI.nextInt();
    // System.out.print("请输入结尾数n:");
    // int n = inputN.nextInt();
    // System.out.print("请输入步进数k:");
    // int k = inputK.nextInt();

    //测试数据
    int i = 1;
    int n = 10;
    int k = 3;

    //两数组用于存储
    List<Integer> list = new ArrayList();
    List<Integer> list2 = new ArrayList();
    List<Integer> combine = new ArrayList();
    List<Integer> combine2 = new ArrayList();
    List<Integer> key = new ArrayList();

    //循环取出i至n的集合
    for(int j = i;j <= n;i++){
    list.add(j++);
    }
    //查看list集合
    System.out.print("最初的原始数组list:"); 
    for(int j=0;j<list.size();j++){
    System.out.print(list.get(j) + " ");
    }

    System.out.println();//行控制

    for(int j=1;j<list.size();j++){
    //m 转化数组元素
    int m = list.get(j-1);
    // System.out.print(m + " ");
    if(j%3==0){

    key.add(j);
    } }

    //查看list集合
    System.out.print("新原始数组list:"); 
    for(int j=0;j<list.size();j++){
    System.out.print(list.get(j) + " ");
    }

    System.out.println();//行控制

    //查看答案数据
    System.out.print("答案数组key:");
    for(int j=0;j<key.size();j++){
    System.out.print(key.get(j) + " ");
    }


    System.out.println();//行控制
    list2.addAll(list);
    list2.removeAll(key);
    //查看list2集合
    System.out.print("去除key数组的list2:"); 
    for(int j=0;j<list2.size();j++){
    System.out.print(list2.get(j) + " ");
    }
    System.out.println();//行控制

    combine.addAll(list);
    combine.addAll(list2);
    //查看合并后的combine数组
    System.out.print("新的combine数组1:"); 
    for(int j=0;j<combine.size();j++){
    System.out.print(combine.get(j) + " ");
    }
    /*
     * i=1234567891011121314151617
     *  k++;
    if((k*3)<combine.size()){
    k++;
    }
    combine.remove(k*3);
    combine2.addAll(combine);&&j<=combine.size()
     */
    combine2.addAll(combine);
    int y = 0;
    for(int j=1;j<=combine2.size();j++){ //循环17次,在此循环中去掉3的倍数
    if(j%3==0){

     y++;

    combine.remove(j-y);//j-1 -2 -3 -4..怎么写?

    }
    }

    System.out.println();//行控制
    System.out.print(combine.get(4) + " ");
    //查看合并后的combine数组
    System.out.print("新的combine数组2:"); 
    for(int q=0;q<combine.size();q++){
    System.out.print(combine.get(q) + " ");
    }

    System.out.println();//行控制

    combine2.removeAll(combine);

    //查看合并后的combine数组
    System.out.print("新的combine2数组3:"); 
    for(int q=0;q<combine2.size();q++){
    System.out.print(combine2.get(q) + " ");
    }

    key.removeAll(key);
    key.addAll(combine2);
    //查看答案数据
    System.out.print("答案数组key:");
    for(int j=0;j<key.size();j++){
    System.out.print(key.get(j) + " ");
    }
    }
    }晚上有努力想了下 感觉看到希望了 但是还是没有解决问题
      

  2.   

    上代码static void printRing(int n, int k, int i) {
        List<Integer> numberList = new LinkedList<Integer>();
        for (int iterN = 0; iterN < n; iterN++)
          numberList.add(iterN + 1);    int count = i - 1;
        while (numberList.size() > 0) {
          Iterator<Integer> listIter = numberList.iterator();
          while (listIter.hasNext()) {
            count++;
            Integer number = listIter.next();
            if (count % k == 0) {
              count = 0;
              System.out.print(number + " ");
              listIter.remove();
            }
          }
        }
      }
      

  3.   

    public class CircleCount {
    private int length;
    private boolean[] arr;

    public CircleCount(int n){
    length=n;
    arr=new boolean[length];
    }
    //初始化数组,使数组内每个元素都为flase
    public void initialize(){
    for(int i=0;i<arr.length;i++){
    arr[i]=false;
    }
    }

    public void removeQueue(int k,int i){
    int flag=i;
    int count=0;
    int accumulate=0;

    while(true){
    //直到所有元素出列才结束
    if(accumulate==length){
    break;
    }

    if(!arr[flag]){
    count++;
    }
    if(count==3){
    count=0;
    accumulate++;
    arr[flag]=true;
    System.out.println(flag+1+"号出现");
    }
    flag=(flag+1)%length;
    }
    }
    public static void main(String[] args) {
    CircleCount c=new CircleCount(20);
    c.removeQueue(3,3);
    }
    }