循环语句包括
1.for循环
2.while循环 先判断 后执行
3.do-while循环 先执行 后判断
for循环和while循环可以相互转换,其中已知循环次数用for循环,未知循环次数用while循环
三个循环的结构和用法很简单,重要的是在编写程序时要注意循环变量的边界值以及循环语句的逻辑。
编写程序
1.输入两个正整数m和n,求其最大公约数和最小公倍数。
比如:12和20的最大公约数是4,最小公倍数是60。
import java.util.Scanner;
public class ForText1 {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入两个正整数:");
int num1 = scan.nextInt();
int num2 = scan.nextInt();
int gcd = -1; //最大公约数
int lcm = 0; //最小公倍数
//先选出最小的数,既然是公约数那一定比最小的数还要小
//第一次循环 除数是最小的数本身,往后依次递减,直到两个正整数都能除尽则跳出循环
int min = (num1 <= num2)? num1 : num2;
for (int i = min;i > 0;i--){
if (num1 % i == 0 && num2 % i == 0) {
gcd = i; //最大公约数
break;
}
}
//先选出最大的数,既然是公倍数那一定小于两个数乘积
//第一次循环 被除数是最大的数本身,往后依次递增,直到能把两个数都除尽则跳出循环
int max = (num1 >= num2)? num1 : num2;
for (int j = max;j <= num1 * num2;j++){
if(j % num1 == 0 && j % num2 == 0){
lcm = j;//最小公倍数
break;
}
}
System.out.println(num1 + "与" + num2 + "的最大公约数为:" + gcd +",最小公倍数为:" +lcm);
}
}
2.从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序。
没有明确的循环次数,可以通过while循环实现,while的表达式中放true可以保证一直循环,再通过break跳出即可。
import java.util.Scanner;
public class LoopText {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入一串整数,以0结束");
int positivenumber = 0;
int negativenumber = 0;
while (true){ //若要使用for循环,可以写成 for(;;){}
int number = scan.nextInt();
if (number == 0)
break;
else if (number > 0)
positivenumber++;
else
negativenumber++;
}
System.out.println("您输入的数字中有" + positivenumber + "个正数," + negativenumber + "个负数");
}
}
3.打印如下的图形:菱形
*
* *
* * *
* * * *
* * * * *
* * * *
* * *
* *
*
public class LoopText2 {
public static void main(String[] args){
System.out.println("*****************");
for (int i = 1;i < 6;i++){
for (int z = 1;z < 6 - i;z++){
System.out.print(" ");
}
for (int j = 1;j <= i;j++)
System.out.print("* ");
System.out.println();
}
for (int i = 1;i < 5;i++){
for (int z = 1;z <= i;z++){
System.out.print(" ");
}
for (int j = 4;j >= i;j--)
System.out.print("* ");
System.out.println();
}
}
}
4.输出100以内所有质数
思路:质数是只能被1和它本身整除的数,最小的质数是2,则可以循环遍历从2开始100以内的数,让他们循环除以从2开始递增一直到本身停止的数。例如对于数字21,让21从除以2开始,检测是否能整除2,不能整除则检测3,下一次再检测4,一直检测到20(21本身无须检查)。若能整除则说明不是质数,跳出内层循环后从22开始新一轮检测。
public class PrimeNumber {
public static void main(String[] args){
int flag = 1; //设置标志位,用于标记是否能整除 初始状态设置为1,即能整除
for (int i = 2;i <= 100;i++){
for (int j = 2;j < i;j++){
if ((i % j )== 0){
flag = 0; //若有能整除的数说明不是质数,更改标志位 跳出循环
break;
}
}
if (flag == 1)
System.out.println(i);
flag = 1;//每检测完一个数都更改标志位回到初始状态
}
}
}
以上虽然可以实现输出,但效率较低,该算法还可以进行优化使得效率更高。
也就是缩减要整除的数的范围。以21为例,检测时会让21从2开始一直除到20来实现检测,那么除数的范围就是2-20。对于非质数来说,一旦发现整除,可以通过break循环跳出,但是对于质数,以23为例,他的除数范围是2-22,也就是23需要循环除21次才能完成检测,下面的方法就是缩减质数的除数范围。
将上一个算法的 j < i 改成 j <= Math.sqrt(i) 即可实现。
Math.sqrt() 为开方运算,也就是说一个质数的除数范围只需要从2到质数开方即可。为什么是开方呢?
每个数都可以写成:a=b×c的形式,也就是说拿a除以b一定会得到c,拿a除以c也一定会得到b。
那么假设当a除以2时会得到x,除以3时会得到y,除以4时会得到z…也就是说:
a = 2 × x
a = 3 × y
a = 4 × z
a = 5 × …
在这里 x一定是最大的,也就是 x > y > z > …
顺序就会变成: 2 3 4 5 6 … q w z y x
从2开始向右逐渐增大,从x开始向左逐渐减小,最终会“相遇”,变为 a = i × i 也就是根下a。
一个数a既然能被2整除也能被x整除,那么只要能被从2到i之间的数整除,也一定能被从i到x之间的数整除。由此就缩小了范围。
public class PrimeNumber {
public static void main(String[] args){
int flag = 1; //设置标志位,用于标记是否能整除 初始状态设置为1,即能整除
for (int i = 2;i <= 100;i++){
for (int j = 2;j <= Math.sqrt(i);j++){
if ((i % j )== 0){
flag = 0; //若有能整除的数说明不是质数,更改标志位 跳出循环
break;
}
}
if (flag == 1)
System.out.println(i);
flag = 1;//每检测完一个数都更改标志位回到初始状态
}
}
}
最后是break和continue关键字的区别
break使用在switch-case和循环结构中,即结束当前的循环
continue使用在循环结构中,即结束当次循环
两个关键字的后面都不能再有执行语句了
当有两层循环时,在内层循环使用break可以跳出内层循环。加入想要在内层使用break跳出外层循环,可以给外层循环加上标签来实现。(continue也可以通过标签控制跳出外层的某次循环)
label:for (;;){//外层循环
for (;;){//内层循环
break label;
}
}