日期:2014-05-20  浏览次数:20916 次

求解答~
产生一个最大数为n的自然数序列。按照给定的自然数m从1到m进行报数。在自然数序列中,数到第m个数时,将该数移除,并从该数的下一个自然数重新开始从1到m报数。到达序列尾部后,从序列头部接着尾部报的数进行。如此往复。请给出算法描述或者伪代码及代码实现,用以输出移除数的顺序。举例:假定n为5,m为2,则自然数序列为1, 2, 3, 4, 5,报数结束后,移除数的顺序为:2, 4, 1, 5, 3。



算法

------解决方案--------------------
package cn.dzr.testnumber;

import java.util.Scanner;

public class NumberGet
{
static int pos = 0;
public static void main(String[] args)
{

Scanner sc =new Scanner(System.in);

System.out.println("请输入n的值:(即数组的最大元素)");

int n = sc.nextInt();


System.out.println("请输入m的值:(即报数的最大值):");
int m = sc.nextInt();

System.out.println("n: "+n + "m: "+ m);
int[] arr = new int[n];

sc.close();

for(int i =0 ;i<n; i++)
{
arr[i] = i+1;
}

// int pos = 0;
while(arr.length>0)
{
int num = getNum(arr,m);
System.out.print(num+" ");
if(arr.length==1)
{
break;
}
arr = getNewArr(arr,pos);
}
System.out.println("over");
}
private static int getNum(int[] arr, int i)
{
//获取该删除的数字的位置..
if(arr.length ==1)
{
return arr[0];
}
pos = pos+ i -1;

//当pos的位置大于数组的长度的时候,需要减去数组的长度...
while(pos>arr.length-1)
{
//当i的值大于或者等于数组的长度的时候,需要将i减去数组的长度的x倍直到i小于数组长度为止。
while(arr.length<i)
{
i = i-arr.length;
}
pos = pos + i - 1 - arr.length;
}


int num = arr[pos];
return num;
}

private static int[] getNewArr(int[] arr, int pos)
{
//该方法获取一个数组第pos个元素被删除后的新数组...
int len = arr.length;
int[] newArr = new int[len-1];

//pos之前的元素未发生变化
for(int i=0;i<pos;i++)
{
newArr[i] = arr[i];
}