Java - 计蒜客 - 判断质数

本文介绍了一个简单的Java程序,用于判断一个给定的整数是否为质数。通过使用平方根优化的方法来提高效率,该程序能够有效地处理1到1000之间的整数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于大于1的数,如果除了1和它本身,它不能再被其它正整数整除,那么我们说它是一个质数。晓萌想判断一个数是不是质数,希望找你写个程序,帮助她进行判断。

输入包括一行,为一个整数N(1 < N ≤1000),正是晓萌给出你让你判断的数字。<n≤1000)。< style="box-sizing: border-box;">

输出包括一行,如果晓萌给出的整数N为质数,那么输出YES;如果N不是质数,那么输出NO。


样例输入
3
样例输出
YES

import java.util.Scanner;  
public class Main{  
	public static void main(String[] args){  
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		
		if(isPrimeNum(a)){
			System.out.println("YES");
		}else{
			System.out.println("NO");
		}
	}
	public static boolean isPrimeNum(int a){
		if(a==1||a==0){
			return false;
		}
		for(int i=2 ;i<=Math.sqrt(a) ;i++){
			if(a%i==0){
				return false;
			}
		}
			return true;
	}
}



### 如何用Java编写判断的程序 在Java中,可以通过多种方式实现素判断的功能。下面提供一种常见的方法来检测给定整是否为素。 #### 方法一:简单循环检查法 这种方法通过遍历从`2`至目标值平方根之间的所有整,逐一尝试作为除去除目标值,以此判定该是否能被任何小于自身的整除。如果存在可以整除的情况,则说明此不是素;反之则是素[^4]。 ```java public class PrimeChecker { public static boolean isPrime(int num) { if (num <= 1) return false; for (int i = 2; i * i <= num; ++i) { // 只需测试到sqrt(num),因为因子总是成对出现 if (num % i == 0) return false; } return true; } public static void main(String[] args) { int testNumber = 17; System.out.println(testNumber + " 是素吗?" + isPrime(testNumber)); } } ``` 上述代码定义了一个名为 `isPrime()` 的静态函,接受一个整型参并返回布尔类型的真伪值表示输入字是否为素。主函部分调用了这个辅助函来进行具体某个(此处设定了变量 `testNumber` 来存储待测据)的素性检验,并打印出结果。 为了提高效率,在实际应用中通常只需要考虑直到√n范围内的可能因子即可完成有效的筛选过程[^5]。 #### 方法二:埃拉托斯特尼筛法优化版 对于更大规模的据集或者频繁查询场景下,还可以采用更高效的算法——埃氏筛法及其改进版本。这里给出一段基于位运算的空间节省型实现: ```java import java.util.Arrays; public class SieveOfEratosthenes { private final byte[] sieve; /** * 构造器初始化指定大小的最大边界内所有的素状态表. */ public SieveOfEratosthenes(int maxLimit) { this.sieve = new byte[(maxLimit >> 3) + 1]; Arrays.fill(this.sieve, (byte) 0xFF); // 初始化全置为1(即假设全部都是素) setBit(0); setBit(1); for (long n = 2L; n * n < maxLimit;) { long m = nextClearBit(n); while ((m *= m) < maxLimit && !getBit(m)) { setBit((int)m); m += n; } n++; } } /** * 设置特定位置上的标志位为已占用/非素. * * @param index 要设置的位置索引 */ private void setBit(long index) { if (index >= 0) { int byteIndex = (int)(index >>> 3); int bitMask = ~(1 << (index & 7)); sieve[byteIndex] &= bitMask; } } /** * 获取下一个未被标记过的最小合对应的起始点. * * @param start 开始寻找的地方 * @return 下一个可用作新轮次起点的合值 */ private long nextClearBit(long start) { do { int bytePos = (int)(start >>> 3); if (((sieve[bytePos]) | ~(-1)) != 0) { int bitOffset = Integer.numberOfTrailingZeros(~sieve[bytePos]); return ((bytePos << 3) | bitOffset); } else { start |= 7L; start++; } } while (++start > 0); throw new AssertionError(); } /** * 判断某一位是否已经被标记过. * * @param pos 需要检查的状态位编号 * @return 如果对应位已被清除则返回false,否则返回true */ private boolean getBit(int pos) { return (pos >= 0) && ((this.sieve[pos >>> 3] & (1 << (pos & 7))) != 0); } /** * 测试接口供外部调用以确认单个整是不是素. * * @param value 待查证的目标整 * @return 若value确实属于素范畴就回传True,反之False */ public boolean contains(int value) { return getBit(value); } public static void main(String[] args) { SieveOfEratosthenes soe = new SieveOfEratosthenes(1000000); System.out.printf("%d 是否是素:%b%n", 9973, soe.contains(9973)); } } ``` 这段更为复杂的例子展示了如何利用预先算好的大范围内所有素的信息快速响应任意询问。虽然初次构建成本较高,但对于多次重复访问同一区间的情形特别有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值