目录
在JAVA中,如何跳出当前的多重嵌套循环?
答:用break或return 的方式。
1.输出:以下图形:
******
******
******
******
for(int j =1;j<=4;j++){
for(int i=1;i<=6;i++){
System.out.print('*');
}
System.out.println();
}
2. 打印三角:
*
**
***
****
*****
******
/* i(行数) j(*的个数)
* 1 1
** 2 2
*** 3 3
**** 4 4
***** 5 5
****** 6 6
*/
for(int i=1;i<=6;i++){//控制行数
for(int j=1;j<=i;j++){//控制每一行有几个星:控制列数
System.out.print("*");
}
System.out.println();
}
3.
******
*****
****
***
**
*
/* i(行数) j(*的个数)
****** 1 6 规律:i+j = 7换句话数:j=7-i;
***** 2 5
**** 3 4
*** 4 3
** 5 2
* 6 1
*/
/*for(int i=1;i<=6;i++){//控制行数
for(int j=6;j>=i;j--){//控制每一行有几个星:控制列数
System.out.print("*");
}
System.out.println();
}*/
for(int i=1;i<=6;i++){//控制行数
for(int j=1;j<= 7-i;j++){//控制每一行有几个星:控制列数
System.out.print("*");
}
System.out.println();
}
4. *
**
***
****
*****
******
*****
****
***
**
*
/*
*
**
***
****
*****
******
*****
****
***
**
*
这个需要两个不同的嵌套循环,一个增加,一个减少,一个正三角加一个倒三角
在开发中嵌套循环最多三层,一般常见的是两层,三层也不会多见,编写代码时需要注意;
嵌套太多容易混乱,也证明编写有问题,最好不要。
如下边代码所示:
*/
//正三角
for(int i=1;i<=6;i++){//控制行数
for(int j=1;j<=i;j++){//控制每一行有几个星:控制列数
System.out.print("*");
}
System.out.println();
}
//倒三角
for(int i=1;i<=5;i++){//控制行数
for(int j=1;j<= 6-i;j++){//控制每一行有几个星:控制列数
System.out.print("*");
}
System.out.println();
}
5. *
* *
* * *
* * * *
* * * * *
* * * *
* * *
* *
*
/* 图1 图2
* ----*
* * ---* *
* * * --* * * ---->上半部分:两个三角
* * * * -* * * *
* * * * * ------转变图形为:图2------> * * * * *
* * * *
* * * -* * * * ------>下半部分:两个三角
* * --* * *
* ---* *
----*
*/
//上半部分
for(int i=1;i<=5;i++){
for(int j=1;j<=5-i;j++){
System.out.print(" ");//System.out.print("-");
}
for(int z=1;z<=i;z++){
System.out.print("*"+" ");
}
System.out.println();
}
//下半部分
for(int i = 1;i <= 4;i++){
for(int j = 1;j <= i;j++){
System.out.print(" ");//System.out.print("-");
}
for(int z = 1;z <= 5-i;z++){
System.out.print("*"+" ");
}
System.out.println();
}
6.打印九九乘法表
/*
嵌套循环的应用1:
九九乘法表
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
*/
class NineNineTable{
public static void main(String[] args){
int sum=0;
for(int i = 1;i<=9;i++){
for(int j=1;j<=i;j++){
sum = i*j;
System.out.print(i+"*"+j+"="+sum +" ");//System.out.print(i+"*"+j+"="+i*j+" ");
}
System.out.println();
}
}
}
7.
100以内的所有质数
质数:素数,只能被1和它本身整除的自然数。----->从2开始,到这个数-1结束为止,都不能被这个数本身整除
如:一个数n ---->n能被1整除 从2,3,4,.... n-1,都不能被整除,最后n他自己可以被整除
最小的质数是:2
/*
100以内的所有质数
质数:素数,只能被1和它本身整除的自然数。----->从2开始,到这个数-1结束为止,都不能被这个数本身整除
如:一个数n ---->n能被1整除 从2,3,4,.... n-1,都不能被整除,最后n他自己可以被整除
最小的质数是:2
*/
class PrimeNumberTest{
public static void main(String[] args){
for(int i=2;i <= 100;i++){//遍历100以内的自然数
boolean isFlag = true;//标识i能否被j除尽,一旦除尽,修改其值;同时重置isFlag的值
for(int j=2;j<i;j++){//j:被i去除
/*
解析:
>if语句时,每一次循环只会输出符合条件的执行语句,每一次循环i都会和每一个j进行
一次运算;
>if-else增加了一个选择,每次循环时,else也会执行一次,
当满足一次else时,会结束循环,往后的j将不会在与i进行计算;
例如 9:它会被认为是质数,这是不对的,程序只对于2进行了计算,输出的是不会被2整
除的数,更像是在计算奇数
>所以,if语句可以在循环中每一个j都会与i进行取模运算,
只要出现一个能够被除尽的j,那么他会执行isFlag = false语句进行标记,
也意味着这个i不是质数不会进行最后的输出
*/
if(i%j==0){//i被j除尽,
isFlag = false;
break;
}
}
if(isFlag==true){
System.out.print(i+" ");
}
}
}
}
8.质数输出问题的优化
如何计算程序运行所花费的时间?
需要使用:System.currentTimeMillis() :这个方法代表获取当前时间距离1970-01-01 00:00:00 的毫秒数
位于API文档:System class下: currentTimeMillis()方法是 long类型的
程序运行时间需要在程序运行首尾都运行该语句,并得出初始时间值和结束时的时间值,二者相见得出程序运行的时间
long start = System.currentTimeMillis();//开始时间
long end = System.currentTimeMillis();//结束时间
System.out.println("程序运行所花费的时间:"+(end - start));
不同的算法对于程序运行的时间有较大差距:
/*
100以内的所有质数
质数:素数,只能被1和它本身整除的自然数。----->从2开始,到这个数-1结束为止,都不能被这个数本身整除
如:一个数n ---->n能被1整除 从2,3,4,.... n-1,都不能被整除,最后n他自己可以被整除
对PrimeNumberTest。java文件中质数输出问题的优化
*/
class PrimeNumberTest1{
public static void main(String[] args){
int count = 0;//10万以内的质数个数
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long start = System.currentTimeMillis();
for(int i=2;i <= 100000;i++){//遍历100000以内的自然数
boolean isFlag = true;//标识i能否被j除尽,一旦除尽,修改其值;同时重置isFlag的值
//for(int j=2;j<i;j++){//j:被i去除
//优化二:对本身是质数的自然数是有效的
for(int j=2;j<= Math.sqrt(i);j++){//----根号i(√i)在代码中表示:Math.sqrt(i):表示开方的意思
/*---------------------------------------------------------------------
为什么√i就可以了呢?
以2-100为例:100=2*50;从50为界2-50他们的在100内都有对应的倍数,大于50的数的倍数要大于100
x*X<=100(x<X)-->x和X取值范围一定<=50,100开方为10,10*10=100;2*50=100;则:2<=x<=10,10<=X<=50
对与乘法运算:2*50=10*10;2,10为100的因数,在程序中2运算后之后,则不必在一直执行到j=50;对于质数和非质数都适用
所以根号i(√i)可以使用
-------------------------------------------------------------------------*/
if(i%j==0){//i被j除尽,
isFlag = false;
break;//优化一:只对本事非质数的自然数是有效的。
}
}
if(isFlag==true){
count++;//9592
//System.out.print(i+" ");
}
}
System.out.println("-----------");
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end = System.currentTimeMillis();
//将输出质数换count++后时间:17969 -- 优化一:break:1497 -- 优化二:14
System.out.println("质数的个数为:"+count);
//时间:20105 -- 优化一:break:2585 -- 优化二:1014
System.out.println("程序运行所花费的时间:"+(end -start));
}
}
9.一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3。编程 找出1000以内的所有完数。(因子:除去这个数本身的其它约数)
class ForForExer{
public static void main(String[] args){
System.out.println("i=");
for(int i = 1;i<=1000;i++){
int sum =0;//每内循环结束,归0
for(int j = 1;j<i;j++){
if(i % j==0){
sum += j;//计算因数的和
}
}
if(i == sum){
System.out.println(i);//i=6 28 496
}
}
}
}