判断输出质素(素数)的程序及其优化

注释中有详解: 

/*
100以内的所有质数的输出。
质数:素数,只能被1和它本身整除的自然数。-->从2开始,到这个数-1结束为止,都不能被这个数本身整除。

最小的质数是:2
*/
class PrimeNumberTest {
	public static void main(String[] args) {
		
		boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值

		for(int i = 2;i <= 100;i++){//遍历100以内的自然数
			
		
			for(int j = 2;j < i;j++){//j:被i去除
				
				if(i % j == 0){ //如果i被j除尽,则i可以被非1和它本身的数除尽,所以不为质数
					isFlag = false;//这个i不为素数的标志
				}
				
			}
			//
			if(isFlag == true){//isFlag == true则所对应的i为质数,输出
				System.out.println(i);
			}
			//重置isFlag
			isFlag = true;
		
		}
	}
}

优化后的:

/*
1000以内的所有质数的输出。实现方式一
质数:素数,只能被1和它本身整除的自然数。-->从2开始,到这个数-1结束为止,都不能被这个数本身整除。

对PrimeNumberTest.java文件中质数输出问题的优化
*/
class PrimeNumber {
	public static void main(String[] args) {
		
		boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
		int count = 0;//记录质数的个数
		for(int i = 2;i <= 1000;i++){//遍历1000以内的自然数
			
			//优化二:
			//for(int j = 2;j < i;j++){//优化前
			for(int j = 2;j <= Math.sqrt(i);j++){//(优化后)j:被i去除
				//Math.sqrt(i)是指根号i的值,j <= Math.sqrt(i)与j < i效果一致但效
				//率更高运算次数更少,具体原因不做多讲解,可b站找个视频,打字讲解太麻烦了
				if(i % j == 0){ //i被j除尽
					isFlag = false;
					break;//优化一:一旦发现i可以被非1和它本身的数整除,说明其为非质素,用break
					//跳出内循环,执行下一轮
				}
				
			}
			//
			if(isFlag == true){
				//System.out.println(i);
				count++;
			}
			//重置isFlag
			isFlag = true;
		}
		System.out.println("质数的个数为:" + count);
	}
}

方法二:

/*
100000以内的所有质数的输出。实现方式二
质数:素数,只能被1和它本身整除的自然数。-->从2开始,到这个数-1结束为止,都不能被这个数本身整除。

对PrimeNumberTest.java文件中质数输出问题的优化
*/
class PrimeNumberTest2 {
	public static void main(String[] args) {
		
		
		int count = 0;//记录质数的个数

		
		label:for(int i = 2;i <= 100000;i++){//遍历100000以内的自然数
			
			for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除
				
				if(i % j == 0){ //i被j除尽
					continue label;
				}
				
			}
			//能执行到此步骤的,都是质数
			count++;
		
		}

		
		System.out.println("质数的个数为:" + count);
		
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
跟我学Java面向对象程序设计技术及应用——识别某个自然数是否为质数(素数)的Java 程序实现示例 1 什么是质数(素数) 1 什么是质数(素数) 对于什么是质数(Prime Number),读者可以查询百科。在百科中的定义如下(如下示图显示具体的定义):质 数又称素数。一个大于1的自然数(读者注意是自然数,不是普通的数字),除了1和它 自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是 合数)。 2 质数(素数)的主要特性 注意:质数(素数)有无限个,例如2,3,5,7,11,13,17 …等都是质数(素数);但0和1不是质数(素数),1既不是质数也不是合数。因为它的 约数有且只有1这一个约数;2是唯一的偶数质数(素数),因为所有其他的偶数都可以 除以2。 质数(素数)在公钥加密算法(如RSA)中有重要的应用。 3 如何判断一个数是否为质数(素数判断一个数是质数(素数),还是合数,可以根据它的约数的个数来确定:只有两个 约数的数,是质数;有三个或三个以上的约数的数是合数;有且只有一个约数的数既不 是质数也不是合数(比如自然数"1"既不是质数也不是合数)。 2 编程识别某个自然数是否为质数(素数)的Java程序实现示例 1 在MyEclipse开发工具中创建Java工程项目 1、启动MyEclipse开发工具,并选择Java Project工程项目 2、在工程项目创建的对话框中输入项目名称JavaDemo,并选择项目存放的目录路径 3、点击对话框中的完成(Finish)按钮,将创建出一个空的Java应用程序项目 2 在创建的Java应用程序项目中添加示例程序类 1、右击所创建的Java应用程序项目名称JavaDemo,在弹出的快捷菜单中选择New新建一 个Java程序类 2、在类创建的对话框中输入包名称为com.bluedream.demo,类名称为JavaPrimeNumber ,并选择需要在JavaPrimeNumber类中创建出main()方法 3、点击对话框中的完成(Finish)按钮,将创建出一个空的Java程序类,在该类中自动 地包含有main()方法 4、编程示例中的功能实现的程序代码 在该Java程序中,获得用户从键盘中输入的一个数字变量,然后判断所输入的这个数 字是否为素数,并打印出判断的结果。 (1)程序代码示例 package com.bluedream.demo; import java.util.Scanner; public class JavaPrimeNumber { public static void main(String[] args) { System.out.println("请输入一个整数 ,并按回车键结束输入:"); int someOneInteger = new Scanner(System.in).nextInt(); for(int loopCounterInt=2; loopCounterInt<someOneInteger; loopCounterInt++){ if(someOneInteger % loopCounterInt==0){ System.out.println("你输入的"+someOneInteger+"不是一个素数。"); break; } else { System.out.println("你输入的"+someOneInteger+"是个素数。"); break; } } } } 示例程序中的循环只需要从自然数2开始(for循环中的int loopCounterInt=2定义),一直循环到小于所识别的数字其自身就可以结束循环。因为 小于等于3的自然数只有2和3是质数。 (2)源程序截图 5、在MyEclipse开发工具中执行该示例程序 (1)启动"Run As"中的"Java Application"运行器以在Java虚拟机环境中执行示例 (2)在显示的控制台中输入数字13,将显示出判断的结果(程序判断正确) (3)再在显示的控制台中输入数字12,将显示出判断的结果(程序判断正确) 3 精益求精优化程序代码 1 优化程序代码示例以提高程序执行的效率 1、前面的程序示例的效率是最低的 前面的示例程序主要是根据质数的定义编程实现的我们只需要从2开始,一直到小于 其自身,依次判断能否被n整除即可,能够整除则不是质数,否则是质数。因此,前面的 示例程序之所以是说效率是最低的,因为循环次数是随着识别的数字增大而增加。当所 识别的数字很大时,循环的次数也将很大。 对于一个正整数n而言,它对(n/2, n)范围内的正整数是必然不能够整除的,因此,在判断n的时候,没有必要让它除以该范 围内的数。据此可以对前面的示例程序代码进

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值