/*
循环结构
一在某些条件满足的情况下,反复执行特定代码的功能
1语句分类: for循环 while循环 do-while循环
2循环语句组成部分:
1,初始化部分
2,循环条件部分(通常情况下,循环结束都是因为出现false)
3,循环体部分
4,迭代部分
二for循环结构
for(初始化条件;循环条件(必须是Boolean类型);迭代条件){
循环体
}
执行过程1-2(true)-3-4-2(true)-3-4-’’’’’-2(false)-循环结束
三,for循环中break的使用,大括号中插入break可以在循环条件为true的
情况下终止循环。一般与if-else配合。
*/
import java.util.Scanner;
class ForTest{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("请输入要重复的语句");
String word = scan.next();
System.out.println("请输入要重复的次数");
int num = scan.nextInt();
for (int i = 1; i <= num; i++ ){ // i值从1不断增加,直到大于num,一共执行numc次
System.out.println(word);
System.out.println("第" + i + "次"); //变量i只在for循环内有效,出了循环失效
}
/*
第二种写法,i从0开始
for (int i = 0; i < num; i++ ){ // i值从0不断增加,直到等于num,一共执行numc次
System.out.println(word + "你好");
}
*/
int num1 = 1;
for (System.out.println("a"); num1 <=3; System.out.println("c"),num1++){//for后面()内只能有两个;表达式内部如果有两句或以上用,分隔开 例如System.out.println("c"),num++
System.out.println("b");
}//输出abcbcbc,
//例题1 ,遍历n以内的偶数,输出结果的总和,输出偶数的个数
System.out.println("请输入n值");
int n = scan.nextInt();
int sum = 0;
int num2 = 0;//必须在for外部先赋值,如果for条件不满足进不去可能会因为变量没有初始化而报错
for (int i = 0; i <= n; i++){
if (i % 2 ==0){
System.out.println(i);
sum += i;//使用+= 进行累加
num2++;//每得到一个偶数数值加1
}
}
System.out.println("n以内偶数的总和为" + sum); //需要放到循环体外
System.out.println("n以内偶数个数为" + num2);
//例题2,遍历1-m,每一行打印一个值,并在3的倍数后打印 “3的倍数”在5的倍数后打印 “5的倍数”在7的倍数后打印 “7的倍数”
/*
//第一种写法
System.out.println("请输入m值");
int m = scan.nextInt();
for (int i = 1; i <= m; i++){
if (i % 3 == 0 && i % 5 == 0 && i % 7 == 0){
System.out.println(i + " 3的倍数" + " 5的倍数" + " 7的倍数");
}else if(i % 3 == 0 && i % 5 == 0){
System.out.println(i + " 3的倍数" + " 5的倍数");
}else if(i % 5 == 0 && i % 7 == 0){
System.out.println(i + " 5的倍数" + " 7的倍数");
}else if(i % 3 == 0 && i % 7 == 0){
System.out.println(i + " 3的倍数" + " 7的倍数");
}else if(i % 3 == 0){
System.out.println(i + " 3的倍数");
}else if(i % 5 == 0){
System.out.println(i + " 5的倍数");
}else if(i % 7 == 0){
System.out.println(i + " 7的倍数");
}else{
System.out.println(i);
}
}
*/
//第二种写法
System.out.println("请输入m值");
int m = scan.nextInt();
for (int i = 1; i <= m; i++){
System.out.print(i + " ");//不换行继续输出
if (i % 3 == 0 && i % 5 == 0 && i % 7 == 0){
System.out.print("3的倍数 " + "5的倍数 " + "7的倍数 ");
}else if(i % 3 == 0 && i % 5 == 0){
System.out.print("3的倍数 " + "5的倍数 ");
}else if(i % 5 == 0 && i % 7 == 0){
System.out.print("5的倍数 " + "7的倍数 ");
}else if(i % 3 == 0 && i % 7 == 0){
System.out.print("3的倍数 " + "7的倍数 ");
}else if(i % 3 == 0){
System.out.print("3的倍数 ");
}else if(i % 5 == 0){
System.out.print("5的倍数 ");
}else if(i % 7 == 0){
System.out.print("7的倍数 ");
}
System.out.println();
}
//输出 1-z的整数,其中3,5,7的倍数不打印
System.out.println("请输入Z值");
int z = scan.nextInt();
for (int i = 1; i <= z; i++){
if (i % 3 == 0 || i % 5 == 0 || i % 7 == 0){
System.out.println();
}else{
System.out.println(i);
}
}
//例题四,输出100-1000中的水仙花数,既 数字本身是各个位上数字的立方之和,例如153=1^3+5^3+3^3
for (int i = 100;i <1000;i++ ){
int iBai = i / 100;
int iShi = i % 100 / 10;
int iGe = i % 10;
if (i == iBai * iBai * iBai + iShi * iShi * iShi + iGe * iGe * iGe ){
System.out.println("找到一个水仙花数" + i);
}
}
//例题五,打印九九乘法表 for语句可以嵌套执行
for (int i = 1;i <= 9;i++ ){
for (int j = 1;j <= 9;j++){
System.out.print(i +"*" + j + "=" + i * j + "\t");
}
System.out.println();
}
//例题六输入x,y,求出x与y的最小公倍数与最大公约数
System.out.println("请输入X值");
int x = scan.nextInt();
System.out.println("请输入Y值");
int y = scan.nextInt();
int max =(x >= y)? x : y;
for (int i = max; i <= x * y; i++){
if (i % x == 0 && i % y == 0){
System.out.println("X与Y的最小公倍数是" + i);//必须在break前输出,否则结果不对
break;
}
}
int min = (x <= y)? x : y; //使用三元运算符判断xy中的最小值
for (int i = min; i > 0; i--){//可以直接写int i = x,不能保证x大小,效率不保证
if (x % i == 0 && y % i == 0){
System.out.println("X与Y的最大公约数是" + i);
break;//找到第一个符合条件的公约数后跳出循环
}
}
//寻找p以内的质数,质数也叫素数,只能被1和它本身整除的自然数,最小的质数是2
System.out.println("请输入p1值");
int p1 = scan.nextInt();
long start = System.currentTimeMillis();//获取当前时间距离1970年1月1日0时0分0秒距离现在的毫秒数,类型为long
boolean isPrime = true; //设置一个布尔变量来判断内层循环结果是否为质数
for (int i = 2;i <= p1 ;i++ ){ //遍历2到p范围内的自然数
for (int j = 2;j < i;j++ ){//设置变量j被i整除
if (i % j == 0){
isPrime = false;
}
}
if (isPrime == true){
System.out.println("找到一个质数" + i);
}
isPrime = true;//重置布尔变量值,为下一次判断做准备
}
long end = System.currentTimeMillis();//1秒等于1000毫秒,用来测试算法效率
System.out.println("程序1执行时间=" + ( end - start ));
//变量可以定义在for循环内部,这样不必在末尾重置
System.out.println("请输入p2值");
int p2 = scan.nextInt();
long start1 = System.currentTimeMillis();
for (int i = 3;i <= p2 ;i +=2 ){ //遍历3到p范围内的奇数,提高效率
boolean isPrime1 = true; //设置一个布尔变量来判断内层循环结果是否为质数
for (int j = 2;j <= Math.sqrt(i);j++ ){//调用Math.sqrt()方法求开方。优化对质数有效,对非质数也有效
if (i % j == 0){
isPrime1 = false;
break;//结束内层循环,只对非质数的自然数有效果,提高效率
}
}
if (isPrime1 == true){
System.out.println("找到一个质数" + i);
}
}
long end1 = System.currentTimeMillis();
System.out.println("程序2执行时间=" + ( end1 - start1));
}
}
/*
循环语句二 while循环
循环语句组成部分
1,初始化部分
2,循环条件部分(通常情况下,循环结束都是因为出现false)
3,循环体部分
4,迭代部分
while循环结构
1
while(2){
3;
4; 如果没有4编译不报错,但会陷入死循环,无限执行,需要保证算法的有限性。
}
cmd命令窗口中陷入死循环按ctrl + c 中止执行
while循环执行过程 1-2(true)-3-4-2(true)-3-4-’’’’’-2(false)-循环结束
for与while的关系,可以互相转换。
for与while 的不同点,while的初始化条件1在循环外部,可以被其他语句调用。
for的初始化条件出了循环结构就不能被调用。
无限循环可以用while(true)或者for(;;)来实现,利用条件判断语句输出break来结束循环
*/
import java.util.*;
class WhileTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = 0 ;
while (i <= 20){
System.out.println("Hello World!");
i++;//可以写成i += 1
}
System.out.println("i值为" + i);//输出21
//循环综合练习
//例题1,从键盘输入不定个数的整数,判断输入数据中整数与负数的个数,当输入0时程序结束
//无限循环可以用while(true)或者for(;;)来实现,利用条件判断语句输出break来结束循环
int positiveNum = 0;
int negativeNum = 0;
while (true){
System.out.println("请输入一个整数");
int num = scan.nextInt();
if (num == 0) {
break;
}else if (num < 0){
negativeNum++;
}else if (num > 0){
positiveNum++;
}
//此处没有迭代体,可以编译通过
}
System.out.println("正数数量为" + positiveNum);
System.out.println("负数数量为" + negativeNum);
//使用for来实现
int positiveNum1 = 0;
int negativeNum1 = 0;
for (positiveNum1 = 0 ,negativeNum1 = 0;true;) {//迭代条件不写,可以编译通过
System.out.println("请输入一个整数");
int num = scan.nextInt();
if (num == 0) {
break;
}else if (num < 0){
negativeNum1++;
}else if (num > 0){
positiveNum1++;
}
}
System.out.println("正数数量为" + positiveNum1);
System.out.println("负数数量为" + negativeNum1);
for (;;) {//等同于while(true)
System.out.println("请输入一个整数");
int num = scan.nextInt();
if (num == 0) {
break;
}else if (num < 0){
negativeNum1++;
}else if (num > 0){
positiveNum1++;
}
}
System.out.println("正数数量为" + positiveNum1);
System.out.println("负数数量为" + negativeNum1);
//练习找到n以内的完数,完数为一个数本身等于它的因子之和,例如6=1+2+3.
System.out.println("请输入一个整数n,以下列出n以内的完数");
int n = scan.nextInt();
int j = 1;
int sum = 0;
while (j <= n){
int k = 1;
while (k < j){ //此处是k<j 不能用<= 否则找不到
if (j % k == 0){
sum += k;
}
k++;
}
if (j == sum){
System.out.println("找到一个完数" + j);
}
j++;
sum = 0;//此处必须重置sum,否则找不到
}
}
}
/*
循环语句三 do while循环
循环语句组成部分:
1,初始化部分
2,循环条件部分(通常情况下,循环结束都是因为出现false)
3,循环体部分
4,迭代部分
do while循环结构
1
do{
3;
4;
}while(2);
cmd命令窗口中陷入死循环按ctrl + c 中止执行
do while循环执行过程 1-3-4-2(true)-3-4–2(true)’’’’’-3 -4 -2(false)-循环结束
do-while特点:至少会执行一次循环体的语句
开发中do-while 较少使用
*/
import java.util.*;
class DoWhileTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//遍历100以内的奇数,并输出奇数个数与总和
int num = 1;
int count = 0;
int sum = 0;
do{
if (num % 2 ==1){
System.out.println(num);
sum += num;
count++;
}
num++;
}
while (num <= 100);
System.out.println("奇数个数为" + sum);
System.out.println("总和为" + count);
}
}