精典程序:九九乘法表
思想:用循环解决各种形状问题
(1)
*
* *
* * *
(2)
*
* *
* * * *
* * * * * *
(3)九九乘法表的形状
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
思想:
1、 这里面有两个数相乘,产生两个数
1-9 乘以 1-9,这里未知数是两个,这两个数字交叉相叉。
凡是思想中存在两值交叉的现象,就是双重循环
两个交叉相乘属于笛卡尔积
构建出来
调整结构
分出行和列的关系
打印的几种函数:
Println 实现的效果:每打印一行,就换行,
Print 实现的效果:不换行
Printf 按某种格式输出,使用 format 格式化的形式输出,不换行
打印过程中的转义字符
需要代表某些特殊意义的字符,称为转义字符
比如两个数据之间长空白(8 个) 制表符 \t
还比如 \n 实现换行
最麻烦的”” ,在 java 编程中,单引号和双引号都有特殊意义,双引号内部输出双引号,可以使
用转义\,加上一个引号
System.out.print("\"");
如果输出斜杠,使用两个斜杠.
System.out.print("\\");
原来
1*1=1 1*2=2 1*3=3 行,转成列
第一个乘数是 i,第二个乘数是 j
根据打印的结果,j<=i 的就打印结果,j>i 的就不打印结果
代码如下:
public class test_nine_nine_multi {
public static void main(String[] args) {
//产生笛卡尔积相乘的两个数字,这就是双重循环
for(int i=1;i<10;i++){
for(int j=1;j<10;j++){
//满足条件的打印,根据去掉部分的特点,j>i的不打印,只打印 j<=i
//注意第一个乘数是 i,第二个乘数是 j,调用位置相当于把行列调换
if(j<=i){
System.out.print(j+"*"+i+"="+i*j+"\t");
}
}
//每打完 9个数字,换个行,第一重循环结束打印换行
System.out.println();
}
}
}
正向思路:
只要 j>i 就使用 break 退出
public class test_nine_nine_multi1 {
public static void main(String[] args) {
//产生笛卡尔积相乘的两个数字,这就是双重循环
for(int i=1;i<10;i++){
for(int j=1;j<10;j++){
//满足条件的打印,根据去掉部分的特点,j>i的不打印,后面的都不打印,节省循环,以直接退出循环
if(j>i){
//这里 break退出,只要打印列数>行数,后面就不循环了,这种方法循环次数会少一些
break;
}
//注意第一个乘数是 i,第二个乘数是 j,调用位置相当于把行列调换
System.out.print(j+"*"+i+"="+i*j+"\t");
}
//每打完 9个数字,换个行,第一重循环结束打印换行
System.out.println();
}
}
}
这个程序比上一次程序循环次数减少.
现在再改,如果 j==i,打印完当次结果,就没有必要再进入循环体,再进入循环体也就是判断退
出,把 j==i 条件放在打印的后面.
最后再优化,把 j==i 后面的循环都不进行操作,这种量级减少循环
public class test_nine_nine_multi2 {
public static void main(String[] args) {
//产生笛卡尔积相乘的两个数字,这就是双重循环
for(int i=1;i<10;i++){
for(int j=1;j<10;j++){
//注意第一个乘数是 i,第二个乘数是 j,调用位置相当于把行列调换
System.out.print(j+"*"+i+"="+i*j+"\t");
//满足条件的打印,根据去掉部分的特点,j=i的打印结束,后面的循环没有必要了
if(j==i){
//这里 break退出,后面的循环完全没有必要
break;
}
}
//每打完 9个数字,换个行,第一重循环结束打印换行
System.out.println();
}
}
}
对比 class 字节的处理
for(int i = 1; i < 10; ++i) {
for(int j = 1; j < 10 && j <= i; ++j) {
System.out.print(j + "*" + i + "=" + i * j + "\t");
}
System.out.println();
}
这种比上面的代码还科学
算法的大 O
第一种双重循环,达到某一条件打印: O(n 平方 )
第二种双重循环:<o 的平方结果的一半
第三种双重循环,比第二重循环少了外层量级的循环次数
在多重循环中,考虑内层循环是否可以再量级减少循环次数.
break 退出,退出一层循环,改变当前层的循环次数
continue 退出:退出当前循环的次数,继续下次循环,不改变总体的循环次数
共同点:都不执行循环体中后面的语句
不同点:continue 结束当前,break 结束本层循环