## Java编程那些事儿41—流程控制综合示例3
郑州游戏学院陈跃峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
##### 5.6.1.5 99乘法表
问题:在控制台打印数学上的99乘法表
该类问题是发现数字的规律,然后将数值的规律用程序描述出来。实际实现时,可能需要耐心的进行调试。在这里,需要实现数字的多行输出,前面使用的System.out.println是输出内容并换行,后续再输出的内容就再下一行显示,如果需要在输出时不换行,则可以使用System.out.print进行输出。
99乘法表的规则是总计9行,每行单独输出,第一行有1个数字,第二行有2个数字,依次类推,数字的值为行号和列号的乘积。
实现思路:使用一个循环控制打印9行,在该循环的循环体中输出该行的内容,一行中输出的数字个数等于行号,数字的值等于行号和列号的成绩。
实现代码如下:
~~~
for(int row = 1;row <= 9;row++){ //循环行
for(int col = 1;col <= row;col++){ //循环列
System.out.print(row * col); //输出数值
System.out.print(' '); //输出数字之间的间隔空格
}
System.out.println(); //一行输出结束,换行
}
~~~
该程序的输出为:
1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
6 12 18 24 30 36
7 14 21 28 35 42 49
8 16 24 32 40 48 56 64
9 18 27 36 45 54 63 72 81
在该输出中,数字之间的对齐有些问题,第四行和第五行的对齐就很明显。那么如果在输出时想让数字对齐,那么就要首先思考数字为什么不能对齐?则问题直观的出现在有些数字是一位数有些是两位数,发现了原因就可以着手解决了,如果想实现数字的左对齐,则在一位数字的后续多输出一个空格,如果想实现数字的右对齐,则只需要在一位数字的前面输出一个空格即可。
以下代码实现了数字的右对齐:
~~~
for(int row = 1;row <= 9;row++){ //循环行
for(int col = 1;col <= row;col++){ //循环列
if(row * col < 10){ //一位数
System.out.print(' ');
}
System.out.print(row * col); //输出数值
System.out.print(' '); //输出数字之间的间隔空格
}
System.out.println(); //一行输出结束,换行
}
~~~
所以在实际书写代码时,代码的位置对于程序逻辑的影响很大,在编写代码时,需要认真考虑代码书写的位置。
##### 5.6.1.6 打印图形
问题:在控制台中打印如下格式的图形
*
***
*****
*******
*********
由于受到控制台输出的限制,只能按照行的上下,依次进行输出,所以解决打印图形的问题时,只能按照从上到下依次输出每行的内容,关键是仔细观察,发现图形的规律。
第一种思路:外部循环循环5次打印5行,每行的内容分为两部分:空格和星号,每行空格的数量是5减去行号个,每行星号的数量是行号的2倍减1个,在外部循环内部先打印空格,再打印星号,每个都只打印1个,使用数量控制对应的打印次数,打印完星号以后换行。
则实现的代码如下:
~~~
for(int row = 1;row <= 5;row++){ //循环行
//打印空格
for(int c1 = 0;c1 < 5 - row;c1++){
System.out.print(' ');
}
//打印星号
for(int c2 = 0;c2 < 2 * row - 1;c2++){
System.out.print('*');
}
//换行
System.out.println();
}
~~~
该代码中row的循环用于控制打印的行数,row变量的值代表行号,内部的循环体分为三部分:打印空格,打印星号和换行,打印的数量参看图形的规律部分。
第二种思路:外部循环循环5次打印5行,内部每行打印的总字符数量是4加行号个,其中前5-行号个字符是空格,后续的字符是星号,所有字符打印完成以后换行。
则实现的代码如下:
~~~
for(int row = 1;row <= 5;row++){ //循环行
//循环总的字符数
for(int col = 0; col < 4 + row;col++){
if(col < 5 - row){ //打印空格
System.out.print(' ');
}else{ //打印星号
System.out.print('*');
}
}
//换行
System.out.println();
}
~~~
该代码的总体思路和第一种思路一样,都是按行打印,只是在考虑问题时首先考虑字符总的数量,把这个数量作为循环次数,内部控制那些该输出字符那些该输出星号即可。
##### 5.6.1.7 质数判断
问题:判断一个自然数是否是质数。
质数指只能被1和自身整除自然数,也称素数,最小的质数是2。对于自然数来说,任何一个数字都可以被1和自身整除。
实现思路:利用数学上的反证法进行判断。则问题转换为只需要判断不能被1和自身以外的任何一个数字整除即可。则假设判断的数字是n的话,则这些数字的区间是[2,n-1]和大于n的所有数字。在数学上n不可能被大于n的数字整除,所以程序只需要判断[2,n-1]之间的数字即可,如果被该区间的任何一个数字整除了,则说明不是质数。
则实现的代码如下:
~~~
int n = 23;
boolean b = true; //存储是否是质数,假设是质数
for(int i = 2;i < n;i++){
//如果整除,则不是质数
if(n % i == 0){
b = false;
break; //后续比较没有意义,结束循环
}
}
//输出是否是质数
if(b){
System.out.println("是质数");
}else{
System.out.println("不是质数");
}
~~~
该代码是最容易思考出来的一种实现,其实在数学上只需要判断n是否可以被2到n的二次方根之间的数字即可。则实现的代码变为如下:
~~~
int n = 23;
boolean b = true; //存储是否是质数,假设是质数
for(int i = 2;i <= Math.sqrt(n);i++){
//如果整除,则不是质数
if(n % i == 0){
b = false;
break; //后续比较没有意义,结束循环
}
}
//输出是否是质数
if(b){
System.out.println("是质数");
}else{
System.out.println("不是质数");
}
~~~
通过缩小判断数字的区间,可以显著提高程序的执行效率。说明:这里的Math.sqrt的功能是计算n的二次方根。
关于流程控制的综合示例部分就介绍这么多,下面将整理一下流程控制的综合练习。
- 前言
- (1)序言
- (2)程序设计是什么?
- (3)你适合学习程序设计吗?
- (4)如何学好程序设计?
- (5)程序设计介绍小结
- (6)计算机软件基本概念
- (7)进制的概念
- (8)计算机内部的数据表达
- (9)网络编程基础
- (10)Java语言简介
- (11)JDK的获得、安装和配置
- (12)第一个HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基础使用进阶
- (15)如何学好Java语法
- (16)代码框架、关键字和标识符
- (17)基本数据类型
- (18)变量和常量
- (19)数据类型转换
- (20)空白、语句结束和注释
- (21)算术运算符
- (22)比较运算符
- (23)逻辑运算符
- (24)赋值运算符
- (25)位运算符
- (26)移位运算符
- (27)其它运算符
- (28)运算符优先级
- (29)表达式
- (30)流程控制基础
- (31)if语句语法(1)
- (32)if语句语法(2)
- (33)if语句语法(3)
- (34)switch语句语法
- (35)while语句语法
- (36)do-while语句语法
- (37)for语句语法
- (38)break和continue语句
- (39)流程控制综合示例1
- (40)流程控制综合示例2
- (41)流程控制综合示例3
- (42)流程控制综合练习
- (43)数组概述
- (44)数组基础语法
- (45)数组使用示例1
- (46)数组使用示例2
- (47)数组使用示例3
- (48)多维数组基础
- (49)多维数组使用示例1
- (50)多维数组使用示例2
- (51)多维数组练习
- (52)方法声明
- (53)方法声明示例
- (54)方法调用
- (55)方法重载和参数传递
- (56)方法练习
- (57)面向对象基础
- (58)类(一)
- (59)类(二)
- (60)对象
- (61)面向对象设计方法和面向对象特性(一)
- (62)继承(二)
- (63)多态性
- (64)访问控制符、修饰符和其它关键字
- (65)static修饰符
- (66)final修饰符
- (67)this和super
- (68)抽象类和接口(一)
- (69)抽象类和接口(二)
- (70)抽象类和接口(三)
- (71)内部类简介
- (72)包的概念
- (73)JDK文档使用
- (74)java.lang包介绍1
- (75)String类使用
- (76)StringBuffer类和System类
- (77)包装类
- (78)时间和日期处理
- (79)Random随机处理
- (80)集合框架简述
- (81)异常处理概述
- (82)异常处理语法1
- (83)异常处理语法2
- (84)IO简介
- (85)IO类体系
- (86)文件操作之File类使用
- (87)文件操作之读取文件
- (88)文件操作之写文件
- (89)读取控制台输入
- (90)装饰流使用1
- (91)装饰流使用2
- (92)IO使用注意问题
- (93)多线程基础
- (94)多线程实现方式1
- (95)多线程实现方式2
- (96)多线程使用示例1
- (97)多线程使用示例2
- (98)多线程问题及处理1
- (99)多线程问题及处理2
- (100)多线程问题及处理3
- (101)网络编程概述
- (102)网络编程技术1
- (103)网络编程技术2
- (104)网络编程技术3
- (105)网络编程技术4
- (106)网络编程技术5
- (107)网络协议概念
- (108)网络编程示例1
- (109)网络编程示例2
- (110)网络编程小结