第二章 Java基本语法(三)

本文主要内容:
循环结构、特殊关键字break和continue的使用,质数问题的优化

在这里插入图片描述
循环结构:Boolean类型

程序编写:
从键盘输入两个正整数m和n,找出他们的最大公约数和最小公倍数。

import java.util.Scanner;
public class test {
    public static void main(String[] args) {
       Scanner scan = new Scanner(System.in);
       
       System.out.println("请输入m:");
        int m = scan.nextInt();
        System.out.println("请输入n:");
        int n = scan.nextInt();
       
        for(int i = (m<n?m:n);i>0;i--) {
               if(m%i == 0 && n%i == 0) {
                      System.out.println("最大公约数"+ i);
                      break;    //一旦在循环中执行到break,就跳出当前循环
               }
        }
        for(int i = (m<n?n:m);i <= m*n;i++) {
               if(i%m == 0 && i%n == 0) {
                      System.out.println("最小公倍数是:"+ i);
                   break;
               }
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.说明:写while循环千万小心不要丢了迭代条件。一旦丢了迭代条件,很可能导致死循环。我们写程序要避免出现死循环
2.for循环和while循环是可以相互转化的。
3.区别:for循环和while循环的初始化条件部分的作用范围不同。
4.do-while循环至少会执行一次循环体!
5.多次执行时,do-while和while没区别
6.在开发中,使用for和while较多一些,较少使用do-while.
在这里插入图片描述

while(true)
说明:1.不在循环条件部分限制次数的结构:for(;;)或者while(true)
2.结束循环有几种方式?
方式一:循环条件部分返回false
方式二:在循环体中,执行break

嵌套循环的使用
1.嵌套循环:将一个循环结构A声明在另一个循环结构B的循环体中。
2.外层循环B、内层循环A

forint i = 0;i<=6;i++{
    for(int j = 0;j<=4;j++){
        System.out.print('*')
    }
    System.out.println();
}

在这里插入图片描述

说明:
1.内层循环结构执行一遍,只相当于外层循环执行了一次。
2.假设外层循环需要执行m次,内层循环需要执行n次,此时内层循环的循环体一共执行了m*n次

forint i = 0;i<=5;i++{
    for(int j = 0;j<=i;j++){
        System.out.print('*')
    }
    System.out.println();
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

九九乘法表
在这里插入图片描述
在这里插入图片描述

100以内所有的质数的输出
质数:也叫素数,只能被1和它本身整除的自然数。
方法一:

 for(int i = 2;i<=100000;i++) {
       boolean isFlag = true;  //标识i是否被j整除,一旦整除,修改其值
       for(int j = 2;j<i;j++) {   
              if(i%j == 0)
                     isFlag = false;
       }
       if(isFlag == true) {
           System.out.println(i);
       }
}
      

对质数问题的优化
方法一:

public class test {
       public static void main(String[] args) {
/*
 优化前:15393
 优化一后:1609
 优化二后: 31
 */
              long start = System.currentTimeMillis();   //获取系统时间的函数,计算了从1970年1月1日00:00:00到现在的时间
       int count = 0;
       boolean isFlag = true;
        for(int i = 2;i<=100000;i++) {
               
               //for(int j = 2;j<i;j++) {
               for(int j = 2;j<Math.sqrt(i);j++) {   //优化二,只需要除到开方的位置,对本身质数的自然数有效
                      if(i%j == 0) {
                             isFlag = false;
                          break;  //优化一:只对本身非质数的自然数有效
                      }
               }
               if(isFlag == true) {
                   //System.out.println(i);
                      count++;
               }
               isFlag = true;
        }
        long end = System.currentTimeMillis();
        System.out.println("质数的个数是" + count);
        System.out.print("运行时间:"+(end-start));
          
       }
}

方法二:

public class test {
       public static void main(String[] args) {
              long start = System.currentTimeMillis();   //获取系统时间的函数,计算了从1970年1月1日00:00:00到现在的时间
       int count = 0;
        label:for(int i = 2;i<=100000;i++) {
               for(int j = 2;j<=Math.sqrt(i);j++) {   //优化二,只需要除到开方的位置,对本身质数的自然数有效
                      if(i%j == 0) {
                             continue label;
                      }
               }
               count++;
               }
        long end = System.currentTimeMillis();
        System.out.println("质数的个数是" + count);
        System.out.print("运行时间:"+(end-start));         
       }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

break和continue默认跳出包括此关键字最近的一层循环
结束最外层循环的方法:

在这里插入图片描述

return的使用
在这里插入图片描述

完数:一个数恰好等于它的因子之和,这个数就称为完数,例如6=1+2+3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值