判断101-200之间有多少个素数,并输出所有素数。

问题:判断 101-200之间有多少个素数,并输出所有素数。
程序分析:
素数:如果一个数只能被1和自己整除,那么这个数就是素数
判断素数的方法:用一个数分别去除 2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
上面有这么一句话:用一个数分别去除2到sqrt(这个数) 为什么除到这个数的开平方就好了呢?假如我判断16是不是素数(16的平方根是4),步骤是这样的:
用16去除2 能整除
用16去除3 不能整除
用16去除4 能整除
(已经除到4啦)
为啥可以不用继续了呢?
你用16去除以8 结果是2 而一开始你已经用16除了2 相当于做了重复的操作 以我的理解 除到平方根的位置 就相当于找到了一个对称位置 超过这个位置的操作就是重复的
程序设计:
这个题中,用双层循环,外循环表示101到200之间的每一个数, 在外层循环设置一个变量用来计数,一个变量用来标记是否是素数, 内循环表示2到这个数的开平方数;首先在内存循环中判断当前这个数能否被2到sqrt(这个数)整除,只有能满足一个 就将标记变为true 并且跳出当前这个循环;然后在外层循环中检查flag的变化 如果flag是false,就表示这个数是素数 就需要将计数器加上一,并且每次在外层循环都需要将flag重置为false (如果不重置的话,假如某一次flag变为了true 之后就一直为true了 就意味着之后每一个数都不是素数了....所以就需要重置)
代码:
import org.junit.Test;
public class IsPrime {
	/**
	 * 统计某个区间素数的方法
	 * @param number1(数字1)
	 * @param number2(数字2)
	 * @return int 素数的个数
	 */
	public static void isPrime(int number1 , int number2) {
		//用来计数的变量
		int total = 0;
		//用来判断是否是素数的标记
		boolean flag = false;
		//外层循环表示遍历两个数之间的所有数
		for(int i = number1 ; i <= number2 ; i++) {
			//内层循环表示遍历从2到这个数的开平方数
			for(int j = 2 ; j <= Math.sqrt(i) ; j++) {
				//如果能整除 就将标记设置为true 并且跳出本次循环
				if(i % j == 0) {
					flag = true;
					break;
				}
			}
			//当标记还是没变化(仍然是false)时  就代表这个数是素数
			if(!flag) {
				total ++;
				System.out.println(i+"是素数");
			}
			//每次计算完一个数都将标记重置为false
			flag = false;
		}
		System.out.println(number1+"和"+number2+"之间的素数个数是"+total);
	}
	/**
	 * 测试
	 */
	@Test
	public void test() {
		isPrime(101 , 200);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值