请教一个关于算法的问题

u010008500 2013-08-22 10:28:20
产生一个最大数为n的自然数序列。按照给定的自然数m从1到m进行报数。在自然数序列中,数到第m个数时,将该数移除,并从该数的下一个自然数重新开始从1到m报数。到达序列尾部后,从序列头部接着尾部报的数进行。如此往复。请给出算法描述或者伪代码及代码实现,用以输出移除数的顺序。举例:假定n为5,m为2,则自然数序列为1, 2, 3, 4, 5,报数结束后,移除数的顺序为:2, 4, 1, 5, 3
...全文
153 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
2013-08-22
  • 打赏
  • 举报
回复
getNum里,需要返回两个值,一个为获取到的数值,例外一个则为删除的位置。但貌似返回值只能有一个,不知道如何处理,所以就用一个静态变量。 这种写法应该是有问题的,但是应该能够解决问题。
2013-08-22
  • 打赏
  • 举报
回复
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;
	}
}
h2plus0 2013-08-22
  • 打赏
  • 举报
回复
貌似有一个算法:约瑟夫环 专门解决这个问题

51,410

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧