当前位置:编程学习 > JAVA >>

请教一个关于算法的问题

产生一个最大数为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];
}
//pos之后的元素向前移动一位
for(int j=pos;j<len-1;j++)
{
newArr[j] = arr[j+1];
}

return newArr;
}
}
--------------------编程问答-------------------- getNum里,需要返回两个值,一个为获取到的数值,例外一个则为删除的位置。但貌似返回值只能有一个,不知道如何处理,所以就用一个静态变量。
这种写法应该是有问题的,但是应该能够解决问题。
补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,