使用Java语言求素数的几个方法

使用Java语言求素数的几个方法

今天找了一篇"面试50题"的文档,第一题是求fibonacci数列,使用递归很容易就实现了,没什么难度.
第二题是输出101~200之间的素数,没用太长时间也做了出来,代码如下

  1. for (int i=101;i<=200;i++) {
        //计算到i的开方为止
    	int dest=(int)(Math.sqrt(i));
    	for (int j=2;j<=(int)(Math.sqrt(i));j++) {
    	    //如果i被j整除立刻跳出内层循环
    		if (i%j==0) {
    			break;
    		}
    		//从2递增直到i的开方都没有除尽,也就是j递增到了dest,那么i就是素数
    		if (j>=dest) {
    			System.out.print(i+"  ");
    		}
    	}
    }
    

然后又进行了改进,不必进行if条件判断
2. //

	a1: for (int i=101;i<=200;i++) {
	
		for (int j=2;j<=(int)(Math.sqrt(i));j++) {
		    //如果i被整除,立刻跳到外层for循环
			if (i%j==0){
				continue a1;
			}
		}
		//一直未被整除,输出i
		System.out.print(i+"  ");
	}

后来又尝试用数组解决问题,不过范围是从3开始到键盘输入的数字
3. //

	Scanner sc=new Scanner(System.in);
	
	System.out.println("请输入数字:");
	int number=sc.nextInt();
	//创建素数数组
	int[] prime=new int[10000];
    prime[0]=2;
    
    int count=1;
    int time=0;
 a1:   for(int i=3;i<=number;i++){
    	//只需把素数当除数,如2,3,5,7...而不是2,3,4,5,6,7...
    	//但缺点是除数还是有点多,比如17的除数有2,3,5,7,11,13,
    	//而我们只需要除以2,3即可,因为(int)Math.sqrt(17)的值是4
    	for(int j=0;j<count;j++){
    		
    		if(i%prime[j]==0){
    			continue a1;
    		}
    	}
    	//将素数加入数组,下标+1
    	prime[count]=i;
    	count++;
    }
    System.out.println("从1到"+number+"之间共有"+count+"个素数,它们分别是:");
   for(int i=0;i<count;i++){
	   System.out.print(prime[i]+"\t");
	   time++;
	   if(time%10==0){
		   System.out.println();
	   }
   }
   sc.close();

}

然后对上面进行了改进
4. //

	Scanner sc=new Scanner(System.in);
	
	System.out.println("请输入数字:");
	int number=sc.nextInt();
	int[] prime=new int[10000];
    prime[0]=2;
    
    int count=1;
    int time=0;
 a1:   for(int i=3;i<=number;i++){
    	for(int j=0;j<count;j++){
    		
    		if(i%prime[j]==0){
    			continue a1;
    		}
    		//这两行代码就是进行的改进,也就是除数大于i的开方后,就可以确定i是素数了
    		//大大减少了计算量
    		if(prime[j]>(int)Math.sqrt(i)){
    			break;
    		}
    	}
    	prime[count]=i;
    	count++;
    }
    System.out.println("从1到"+number+"之间共有"+count+"个素数,它们分别是:");
   for(int i=0;i<count;i++){
	   System.out.print(prime[i]+"\t");
	   time++;
	   if(time%10==0){
		   System.out.println();
	   }
   }
   sc.close();

}

当然,要实现要求的功能,对输出的for循环稍作修改即可,在这里就不多做描述了

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值