上次的分支结构忘记标记Lecture4了,...,本次的学习笔记还是分支结构的一些学习,包括一些小例子,找最大公约数和最小公倍数,while、do-while、for循环的学习,包括统计正负数的个数例子,通过嵌套循环输出99乘法表以及带标签的break及continue语句的使用,并通过输出给定范围内的质数例子及优化,初步了解算法的重要性。下面是我复现的code:
/*
输入两个正数m、n,求其最大公约数和最小公倍数
*/
import java.util.Scanner;
class ForTest
{
public static void main(String[] args)
{
Scanner scan=new Scanner(System.in);
System.out.println("请输入第一个正整数");
int m=scan.nextInt();
System.out.println("请输入第二个正整数");
int n=scan.nextInt();
//获取两个数中的较小值
int min=(m<=n)?m:n;
int max=(m>n)?m:n;
int mul=m*n;
for(int i=min;i>=1;i--)
{
if((m%i==0)&&(n%i==0))
{
System.out.println("最大公约数为"+i);
break;//一旦在循环中执行到break就终止循环
}
}
for(int i=max;i<=mul;i++)
{
if((i%m==0)&&(i%n==0))
{
System.out.println("最小公倍数为"+i);
break;
}
}
}
}
/*
循环的4个要素
1.初始化条件
2.循环条件:Boolean类型的
3.循环体
4.迭代条件
1;
while(2)
{
3;
4;
}
while循环不要丢了循环迭代条件,否则就为死循环
要保证算法的有限性
for循环和while循环可以相互转换
区别:for循环和while循环初始化条件的作用域不同
*/
class WhileTest
{
public static void main(String[] args)
{
//eg:遍历100内的所有偶数
int i=1;
while(i<=100)
{
if(i%2==0)
System.out.println(i);
i++;
}
}
}
/*
do-while循环的使用
循环的4个要素
1.初始化条件
2.循环条件:Boolean类型的
3.循环体
4.迭代条件
循环结构:
1;
do
{
3;
4;
}while(2);
执行过程:1->3->4->2->3->4->2...->2
说明:do-while循环至少会执行一次循环体
*/
class DoWhileTest
{
public static void main(String[] args)
{
//遍历100以内的偶数,并计算所有偶数的和及偶数的个数
int i=1;
int sum=0;
int count=0;
do
{
if(i%2==0)
{
System.out.println(i);
sum+=i;
count++;
}
i++;
}
while (i<=100);
System.out.println("所有偶数的和为"+sum);
System.out.println("偶数的个数为"+count);
}
}
//从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序
//import java.util.Scanner 前面已经导入
//结束循环的方式:方式一:根据循环的终止条件结束 方式二:在循环体中执行break
//方法一:
class Exe1
{
public static void main(String[] args)
{
Scanner data=new Scanner(System.in);
int pNum=0;
int nNum=0;
int num;
System.out.println("请输入数据");
num=data.nextInt();
while(num!=0)
{
if(num>0)
{
pNum++;
}
else if(num<0)
{
nNum++;
}
System.out.println("请继续输入数据");
num=data.nextInt();
}
System.out.println("正数的总个数为"+pNum);
System.out.println("负数的总个数为"+nNum);
}
}
//方法二:
//import java.utill.Scanner 前面已经导入包
class Exe2
{
public static void main(String[] args)
{
Scanner data1=new Scanner(System.in);
int positiveNumber=0;
int negativeNumber=0;
while(true)//等价于for(;;),不可以写while(1 )
{
int num=data1.nextInt();
if(num>0)
{
positiveNumber++;
}
else if(num<0)
{
negativeNumber++;
}
else
{
break;
}
}
System.out.println("正数的总个数为"+positiveNumber);
System.out.println("负数的总个数为"+negativeNumber);
}
}
/*
嵌套循环的使用:
1.嵌套循环:将一个循环结构声明在另一个循环结构的循环体中
2.内层循环结构循环一遍,外层循环执行一次
外层循环执行m次,内层循环执行n次,完成一共执行m*n次
3.外层循环控制行数,内层循环控制列数
*/
class NestedLoop
{
public static void main(String[] args)
{
/* 输出 :
******
******
******
******
*/
for(int i=1;i<=4;i++)
{
for(int j=1;j<=6;j++)
{
System.out.print('*');
}
System.out.println();
}
System.out.println();
/*
输出:
*
**
***
****
*/
for(int i=1;i<=4;i++)
{
for(int j=1;j<=i;j++)
{
System.out.print('*');
}
System.out.println();
}
}
}
/*
九九乘法表
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
...
9*1=9 ... ... 9*9=81
*/
class NineNineTable
{
public static void main(String[] args)
{
for(int i=1;i<=9;i++)
{ for(int j=1;j<=i;j++)
System.out.print(i+"*"+j+"="+i*j+" ");
System.out.println();
}
}
}
/*
100以内质数的输出及优化
最小的质数为2
*/
class PrimeNumberPrint1
{
public static void main(String[] args)
{
int count=0;
long startTime=System.currentTimeMillis();//获取当前时间距1970年1月1号的时间ms数
//boolean isFlag=true;//标识i是否被j除尽过
for (int i=2;i<=100000 ;i++ )
{
boolean isFlag=true;//将isFlag设置在此处便不用再重置isFlag
//for(int j=2;j<i;j++)
for(int j=2;j<=Math.sqrt(i);j++)//优化2:将中间j的判断条件转换为sqrt(i),两两相乘,;临界值为两个因数相同
{
if((i%j)==0)
{
isFlag=false;
break;//优化1:加入break,如果被一个整除,后面就不用再试了,只对本身非质数的自然数有效
}
}
if(isFlag==true)
{
//System.out.println("数"+i+"为质数");
count++;
}
//isFlag=true;//重置Flag,一个Flag只能去测试一个数
}
long endTime=System.currentTimeMillis();
long time=endTime-startTime;
System.out.println("花费时间为"+time+"ms");
System.out.println("质数的个数为"+count);
}
}
/*
berak和continue关键字的使用
break:循环和switch-case语句 :结束本层循环
continue:循环结构: 结束本次循环
在break和continue关键字后面不能有执行语句
默认结束最近的一层循环
*/
class BreakContinueTest
{
public static void main(String[] args)
{
for(int i=1;i<=10;i++)
{
if(i%4==0)
{
break;
}
System.out.println(i);
}
//只会输出1 2 3
for(int i=1;i<=10;i++)
{
if(i%4==0)
{
continue;
}
System.out.println(i);
}
//输出1 2 3 5 6 7 9 10
label:for(int i=1;i<10;i++)
{
for(int j=1;j<10;j++)
{
break label;//跳出的是label的循环,带标签的break的使用
//continue label;//跳出指定label的当次循环,带标签的continue的使用
}
}
}
}
class PrimeNumberPrint2
{
public static void main(String[] args)
{
int count=0;
long startTime=System.currentTimeMillis();
label: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)
continue label;
}
//能执行到此步都为质数
count++;
}
System.out.println("质数的个数为"+count);
long endTime=System.currentTimeMillis();
long time=endTime-startTime;
System.out.println("花费时间为"+time+"ms");
}
}