判断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);
	}
}
发布了72 篇原创文章 · 获赞 49 · 访问量 16万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览