唐山企业网站,网站建设费计入那个科目,牛企网络,啄木鸟网站建设1.0 Q: 输出 100 以内所有质数
1.1
/* 第一层循环控制检查到哪个数* 第二层通过遍历除以每个比他小的数的方式,检查每个数是不是质数* 由于要遍历检查,设置一个标记,只要任意一次循环可以整除,我们就设置该标记为不是质数
*/boolean isPrime true;for (int i 2; i 100…1.0 Q: 输出 100 以内所有质数
1.1
/* 第一层循环控制检查到哪个数* 第二层通过遍历除以每个比他小的数的方式,检查每个数是不是质数* 由于要遍历检查,设置一个标记,只要任意一次循环可以整除,我们就设置该标记为不是质数
*/boolean isPrime true;for (int i 2; i 100; i) {for (int j 2; j i; j) {if ( i % j 0 )isPrime false;}if(isPrime true)System.out.println();存在的问题
第二层循环中 j i 次数太多了 例如检查 20 是不是质数。用 20 除 1/2/3/…但是除到 10 就可以停止了因为用 20 除 11/12是没有意义的是一定不能整除的不影响质数判断。在每次外层循环开始时将 isPrime 重置为 true确保对每个数字i的新检查都是从假设它是质数开始的。在错误的版本中由于没有刷新这个状态导致从第一个不是质数的数开始就一直是 false 到结束了。添加 break 语句在发现非质数时立即退出内层循环避免不必要的迭代。
1.2
boolean isPrime true; for (int i 2; i 100; i) {isPrime true; // 每次检查新数时需要重置isPrime为true//除到自己的一半大的数就可以停止,继续是没有意义的.for (int j 2; j i/2; j) {if (i % j 0) { isPrime false; break; // 一旦确定不是质数就跳出循环提高效率}}if (isPrime) { System.out.println(i); }
}2. 找 100 以内两两相邻的、且差值于2的质数对
例如 (35571113
思路 1 先找出所有质数顺序装入数组。用 for 循环遍历只要 prime[i] 2 primes[i1]就输出这两个数思路 2每次找出一个质数 i就直接判断 i 2 是不是质数如果也是那就输出这两个数
这里实现思路 2.
相对与第一题这里还有一个改进。那就是提前用 num i 接住最外层的循环值检查到哪个数了 for (int i 2; i 100; i) {boolean isPrime true;for (int j 2; j i / 2; j) {if (i % j 0) {isPrime false;}}if (isPrime) {i 2;boolean isPrime2 true;for (int k 2; k i / 2; k) {if (i % k 0) {isPrime2 false;}}if (isPrime2)System.out.println(i , (i - 2));}}对于输出结果来说显然不对35被忽略了。
分析 可以看到第一轮检查 2 时是正常的。即检查 2 是质数后将 i 2检查 4 不是质数 所以不输出。接下来应当检查 3 。 但是由于 i 2 这个操作仍是在最外层循环内做的因此这个操作会将这个改变带到下一次的大循环直接来说就是下一次不检查 3 了变成检查 5 了 for (int i 2; i 100; i) {//要使用且改变外层循环的层数,预先定义一个变量来接收,这样就不会影响到外层循环int num i;boolean isPrime true;for (int j 2; j num / 2; j) {if (num % j 0) {isPrime false;}}if (isPrime) {num 2;boolean isPrime2 true;for (int k 2; k num / 2; k) {if (num % k 0) {isPrime2 false;}}if (isPrime2)System.out.println(num , (num - 2));}}