好吧,今天一整天都是用循环求各种数,想破了我的小脑袋啊!
参考: 《Java语言程序设计(基础篇)》P—161
所谓素数,就是只能被1和它自身整除的数字。
约数,我想大家都应该知道公约数吧,那么,我们就先从简单的求一个数的最小因子/约数
开始 ! divisor: 除数
【demo是项目名称,Welcome是公共类名,和java文件的前缀名是一样的,首字母必须大写】
1 package demo; 2 3 public class Welcome { 4 public static void main(String[] args) { 5 int factor = 9; 6 int divisor = 2; 7 8 while (divisor < factor) { 9 if (factor % divisor == 0) 10 break; 11 divisor++; 12 } 13 System.out.println(factor + "除1之外的最小约数是: " + divisor); 14 } 15 }
break 是用来跳出while循环用的!
-------------------------------------------------------------------------------------------------
接下来是稍微难一点的求两数的最大公约数
【公约数是指能同时被两个整数整除的数: 所以下面用到了&&,表示"和"的意思】
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package demo; 2 3 import java.util.Scanner; 4 5 public class Welcome { 6 public static void main(String[] args) { 7 Scanner input = new Scanner(System.in); 8 9 System.out.print("输入两个整数: "); 10 int num1 = input.nextInt(); 11 int num2 = input.nextInt(); 12 int gcd = 2; 13 int divisor = 2; 14 15 while (divisor <= num1 && divisor <= num2) { 16 if (num1 % divisor == 0 && num2 % divisor == 0) { 17 gcd = divisor; 18 } 19 divisor++; 20 } 21 System.out.println(num1 + "和" + num2 + "的最大公约数是: " + gcd); 22 } 23 }
因为我们要求出的是最大的那个公约数,所以要让divisor(被除数, divisor++;)每次自增1, 直到大于
num1或num2为止。这样,最后一个可以被整除的数( gcd = divisor; )就是最大公约数啦!
---------------------------------------------------------------------------------------------------
Q~Q Boss登场,该是打印前五十个素数的时候啦! ! !
任务:
打印前50个素数,并分成五行显示,每行十个数。
思路:
1. 要打印五行,也就是每次总的循环要打印一行,也就是要循环五次,这时要用到计时器控制的循环 !
int count = 0;
while (count < 50)
那么问题又来了,这个count什么时候才递增呢?当然不能每次循环都递增,为什么呢?因为我们只循环50
次,那么当然是遇到真正的素数,count才加1啦。那么,在筛选出素数后,怎么告诉if语句,这是素数呢?
我们给它一个布尔值作为证明,只有当isPrime的值是true时,if才执行......
1 while (count < 50) { 2 boolean isPrime = true; 3 4 if (isPrime) { 5 count++; 6 7 } 8 }
2. 要筛选出素数,必须拿每个可能的整数,去除以从2开始到整数/2的每个除数(divisor),这里又要用
到一个循环,去迭代/遍历每个上述范围的除数,直到遇到可以整除的除数,证明其不是素数,跳出循环。
1 for (int divisor = 2; divisor <= num / 2; divisor++) { 2 3 if (num % divisor == 0) { 4 // 跳出这个for循环 5 break; 6 } 7 8 num++;
注意: 既然跳出循环,那就不是素数了,不要忘记递增被除数,以便于测试新的被除数 ~
或者为了写得更容易看懂,可以啰嗦一点。写成if—else的形式:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 for (int divisor = 2; divisor <= num / 2; divisor++) { 2 3 if (num % divisor != 0) 4 // 除以1个除数有余数不代表它就不是素数,跳出本次迭代,继续测试,但divisor仍会加1 5 continue; 6 else 7 /** 能被一个除1和它自身之外的整数diviso整除,说明它已经是一个素数,没必要再测试了 8 跳出整个循环 **/ 9 break; 10 }
3. 分五行显示, 每行十个数,意味着每一行到了第十个数之后才换行,很明显,由于是当 isPrime为true时,
(为false时跳出循环,为非素数),count才从0开始递增,所以有多少个count,就有多少个素数 ! ! !
1 if (isPrime) { 2 count++; 3 4 if (count % 10 == 0) 5 System.out.println(num); 6 else 7 System.out.print(num + " "); 8 }
备注: 素数—既然是只能被1和它自身整除的整数。那么,它的除数首先就排除1和它自身,也即除数不包括1
(被除数 / 除数 = 商) 和它自身,那么除数最大可以到哪呢? 换个角度想,我们在求一个数有多少个约数时,
是不是先拿它去除以1,2,3.....,也就是,当被除数除以1时,它的商最大,反过来,商也是可以作除数的,
如果排除1作商的这种情况,那就是当被除数除以2的时候,它的商/除数最大。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package demo; 2 3 public class Welcome { 4 public static void main(String[] args) { 5 System.out.println("显示从2开始的前五十个素数: "); 6 7 int count = 0; 8 int num = 2; 9 10 while (count < 50) { 11 boolean isPrime = true; 12 for (int divisor = 2; divisor <= num / 2; divisor++) { 13 if (num % divisor == 0) { 14 isPrime = false; 15 break; 16 } 17 } 18 /** 这里的println表示打印完后自动换行, 由于我们每行要放十个素数, 19 所以在第十个数打印完后要换行, 因此在少于十个数时用先用print, 然 20 后在第十个数之后用println **/ 21 22 if (isPrime) { 23 count++; 24 if (count % 10 == 0) 25 System.out.println(num); 26 else 27 System.out.print(num + " "); 28 } 29 num++; 30 } 31 } 32 }
【注意: 这里易错点是把boolean isPrime = true;放在循环前面。这样一旦遇到第一个非素数4,isPrime将
永远是false】只打印非素数4之前的两个素数......
正确的结果:
发现有点排列不整齐,怎么整呢?
这个时候就要用到我们的格式化字符串了,左对齐用%-5d(%d表示整数型,f表示浮点型), 右对齐用%5d
(数字表示整数占的位数,如果不足用空格代替)
将倒数那几行打印的代码替换成:
if (count % 10 == 0)
System.out.println(num);
else
System.out.printf("%-5d", num);