蓝桥杯大赛编程大题——幸运数

撕酸奶皮子 2013-05-05 11:37:41

标题:幸运数

幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的“筛法”生成。

首先从1开始写出自然数1,2,3,4,5,6,....

1 就是第一个幸运数。
我们从2这个数开始。把所有序号能被2整除的项删除,变为:

1 _ 3 _ 5 _ 7 _ 9 ....

把它们缩紧,重新记序,为:

1 3 5 7 9 .... 。这时,3为第2个幸运数,然后把所有能被3整除的序号位置的数删去。注意,是序号位置,不是那个数本身能否被3整除!! 删除的应该是5,11, 17, ...

此时7为第3个幸运数,然后再删去序号位置能被7整除的(19,39,...)

最后剩下的序列类似:

1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, ...

本题要求:

输入两个正整数m n, 用空格分开 (m < n < 1000*1000)
程序输出 位于m和n之间的幸运数的个数(不包含m和n)。

例如:
用户输入:
1 20
程序输出:
5

例如:
用户输入:
30 69
程序输出:
8



资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗 < 2000ms


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

...全文
3435 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin505494784 2014-03-17
  • 打赏
  • 举报
回复
6楼的哥们儿,你说的有问题吧!你打印出来的仅仅是两句输出语句的用时,当然是几乎不需要时间,你把计算过程放到静态代码块里面了,真正的用时绝对得4秒以上。还有就是,幸运数就是素数?
SeanLi 2013-07-04
  • 打赏
  • 举报
回复
目测线段树能达到nlogn
qbz_96 2013-05-15
  • 打赏
  • 举报
回复
import java.util.ArrayList;
import java.util.Scanner;

public class test8 {
	
	public static ArrayList<Integer> v1=new ArrayList<Integer>();
	public ArrayList<Integer> v2=new ArrayList<Integer>();
	public static int i1=1;//表示的是第i个数是要进行迭代的数
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int a=scanner.nextInt();	//a是小的那个数	
		int b=scanner.nextInt();	//b是大数	
		for(int i=0;i<=b;i++){
			v1.add(i);
		}
		test8 t=new test8();
		t.dieDai(2);
		int j=0;
		for(int l=1;l<v1.size();l++){
			if(v1.get(l)>=a&&v1.get(l)<=b){
				j++;
			}
		}
		System.out.println("性运输的个数是:"+(j-1));
	}
	
	public void dieDai(int lucky){
		int temp=0;
		
		if(lucky>=v1.size()){
			return ;
		}	
		for(int i=1,j=0;i<v1.size();i++){	
				if(i%lucky==0){
				v2.add(v1.get(i));
				j++;
			}		
		}
		v1.removeAll(v2);
		v2.removeAll(v2);
		i1+=1;
		lucky=v1.get(i1);
		dieDai(lucky);
	}

}
这段代码效率很低,但是很容易懂,采用的是递归方法!
skillart 2013-05-14
  • 打赏
  • 举报
回复
不打表m=1,n=1000000大概2s左右出来结果。打表之后几乎不需要时间。

import java.util.Scanner;
public class XingYun2 
{	
	static int a[]=new int[500000+1];
	static void isPrime(int start,int a[],int len)
	{
		int k=start,num=a[start];
		for(int i=k;i<len;i++)
		{
			if(i%num!=0) a[k++]=a[i];
		}
		if(num<len)isPrime(start+1,a,k);
	}
	public static void main(String[] args)
	{
		
		int len=500000,kinds=0;
		for(int i=1;i<len;i++) a[i]=2*i-1;
		isPrime(2,a,len);
		Scanner cin=new Scanner(System.in);
		int m=cin.nextInt();
		int n=cin.nextInt();
		long sta=System.currentTimeMillis();
		for(int i=1;i<len;i++)
		{
			if(a[i]>m && a[i]<n)  kinds++;
			if(a[i]>=n) break;
		}
		System.out.println(kinds);
		System.out.print("时间:");
		System.out.println(System.currentTimeMillis()-sta);//时间
	}
}
//1 1000000
//499998
//时间:4ms
skillart 2013-05-14
  • 打赏
  • 举报
回复

贝杯 2013-05-13
  • 打赏
  • 举报
回复


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


//这是最烂的实现  测试1000*1000时用时较长 二十秒左右
public class LuckNumber {

	
	public static void main(String[] args) {
		
		//初始化
		int m=30;
		int n=69;
		
		
		if(m==1){
			m=2;
		}
	
		List nums=new ArrayList();
		for(int i=1;i<=n;i++){
			nums.add(i);
		}
		for(int i=0;i<nums.size();i++){
			if(nums.get(i)==null){
				nums.remove(i);
			}
		}
		
		List nums1=new ArrayList();
		for(int i=1;i<=m;i++){
			nums1.add(i);
		}
		for(int i=0;i<nums1.size();i++){
			if(nums1.get(i)==null){
				nums1.remove(i);
			}
		}
	
		
		nums=pro(nums);
		nums1=pro(nums1);
		
		for(int i=0;i<nums.size();i++){
			if((Integer)nums.get(i)==m||(Integer)nums.get(i)==n){
				nums.remove(i);
			}
				
		}
		for(int i=0;i<nums1.size();i++){
			if((Integer)nums1.get(i)==m||(Integer)nums1.get(i)==n){
				nums1.remove(i);
			}
				
		}

		
	
		System.out.println(nums.size()-nums1.size());

	}
	
	static List pro(List nums){
		
		int c=1;
		int i=(Integer) nums.get(c);
		while(nums.size()/i>=1){
			List nums_s=new ArrayList();
			nums_s.addAll(nums);
			nums.clear();
			for(int a=0;a<nums_s.size();a++){
				if((a+1)%i==0){
					nums_s.set(a, null);
				}
			
			}
			for(int a=0;a<nums_s.size();a++){
				if(nums_s.get(a)!=null){
					nums.add(nums_s.get(a));
				}
			}
			c++;
			
			if((Integer)nums.get(0)==1){
				if(nums.size()>c-1){
					i=(Integer) nums.get(c-1);
				}
				
			}
			else if(c<nums.size()-1){
				i=(Integer) nums.get(c);
			}
			
		}
		
		return nums;
	}
}
「已注销」 2013-05-12
  • 打赏
  • 举报
回复
2s的时间保证不了 yidianier 的对小的mn输入还可以,但是大的就慢到不行五位数以上就明显开始变慢了
yidianier 2013-05-08
  • 打赏
  • 举报
回复
import java.util.List;
import java.util.Scanner;
import java.util.Vector;

public class test83 {

	public static List xy(List list, int i) {
		List lst = new Vector();

		if (i >= list.size())	//递归出口
			return list;

		int t = (Integer) list.get(i);//获取幸运数字

		if (t == 1) {			//1这是特殊情况
			t = 2;
		}

		int l = list.size() / t;//移除转移操作执行l次
		int y = list.size() % t;//计算list剩余数目

		for (int k = 0; k < l; k++) {
			for (int j = 0; j < (t - 1); j++) {
				lst.add(list.remove(0));//将保留数放入新list,放入数目与幸运数字大小有关
			}
			list.remove(0);//移除掉非保留数
		}
		if (y > 0) {
			for (int k = 0; k < y; k++) {
				lst.add(list.remove(0));//将list剩余数加入新list
			}
		}

		i++;//幸运数游标加1
		List nlst = xy(lst, i);//递归直到递归出口

		return nlst;
	}

	public static int p(int m, int n) {//筛选符合条件的数字数目
		List list = new Vector();
		for (int i = 1; i <= m + n; i++) {
			list.add(i);
		}

		List nl = xy(list, 0);
		int c = 0;
		for (int j = 0; j < nl.size(); j++) {

			int nn = (Integer) nl.get(j);
			if (m < nn && n > nn) {
				c++;
			}
		}
		return c;
	}

	public static void main(String[] args) {
		
//		System.out.print("用户输入:");
		
		Scanner sc = new Scanner(System.in);

		int m = sc.nextInt();
		int n = sc.nextInt();
		sc.close();

		int res = p(m, n);
		System.out.println(res);
		
	}

}
Inhibitory 2013-05-06
  • 打赏
  • 举报
回复
这个就是筛选法求素数

58,454

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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