JavaSE 第四章 流程控制之循环结构练习

本文章基于b站:BV1RK4y1g7A5 赵珊珊老师的java课程的学习加以个人理解做出的学习笔记整理。(p72-p77) 

目录

 输出1-100中被5整除的数,每行输出6个

当输入666时,退出程序 

九九乘法表 

打印形状

长方形 

平行四边形 

三角形 

菱形 

菱形法二 

 解决二元一次方程问题

 百钱买百鸡


 输出1-100中被5整除的数,每行输出6个

【1】输出1-100中被5整除的数,每行输出6个

思路:

①输出1-100;for(){ sout i }

②被5整除; i%5==0

③每行6个; 给符合题意的数计数,if(count%6==0){sout} 换行

        Scanner sc = new Scanner(System.in);
        System.out.print("请输入要被x整除:x = ");
        int x = sc.nextInt();
        System.out.print("请输入每行输出y个:y = ");
        int y = sc.nextInt();
        int count = 1;
        for (int i = 1; i <= 100; i++) {
            if (i % x == 0) {
                // 每行最后一个不加\t
                if (count % y != 0) {
                    System.out.print(i + "\t");
                } else {
                    System.out.print(i);
                    System.out.println();
                }
                // 给符合题意的数字计数
                count++;
            }
        }

当输入666时,退出程序 

【2】

(1)录入10个整数,当输入666时,退出程序(被迫退出)

重复输入---》for循环;if(num==666){break;}

(2)判断其中录入的正数个数并输出

if(num>0){count++};

(3)判断系统的退出状态:是正常退出(录完10个)还是被迫退出(输入666)

正常flag=true;被迫flag=false;

        boolean flag = true;
        int count = 0;
        Scanner sc = new Scanner(System.in);
        // 【1】
        for (int i = 1; i <= 10; i++) {
            System.out.print("请输入第" + i + "个数:");
            int num = sc.nextInt();
            if (num > 0) {
                if (num == 666) {
                    flag = false;
                    break;
                }
                // 放在num == 666之后,正数个数不包括666
                count++;
            }
        }
        System.out.println("正数有:" + count + "个");
        if (flag) {
            System.out.println("正常退出");
        } else {
            System.out.println("被迫退出");
        }
    }

九九乘法表 

【3】正序九九乘法表

 ①打印一行 sout 1*6=6;sout 2*6=12;sout 3*6=18;...第一个数递增,用for(int i =1;i<=6;i++)

sout改为i*6=i*6

②同样的for循环 sout i*7=i*7;第二个数也是递增,for (int j=1; j<=9;j++){①};循环体①中用了i,故换成j

sout改为i*j=i*j

        // 有9行
        for (int j = 1; j <= 9; j++) {
            // 循环一行
            for (int i = 1; i <= j; i++) {
                System.out.print(i + "*" + j + "=" + i * j + "\t");
            }
            System.out.println();
        }
// 倒序九九乘法表
for (int j = 9; j >= 1; j--) {
    // 循环一行
    for (int i = 1; i <= j; i++) {
        System.out.print(i + "*" + j + "=" + i * j + "\t");
    }
    System.out.println();
}

打印形状

长方形 

 【4.1】长方形
①打印1行9个for(;i<=9;){sout"*"}
②打印4行for(;j<=4;){①}
③左边留空:在②中for(;i<=4;){sout" "}

        // (2) 
        for (int j = 1; j <= 4; j++) {
            // (3)
            for (int i = 1; i <= 4; i++) {
                System.out.print(" ");
            }
            // (1)
            for (int i = 1; i <= 9; i++) {
                System.out.print("*");
            }
            System.out.println();
        }

平行四边形 

【4.2】平行四边形

①第1行,4个空格
①第2行,3个空格
①第3行,2个空格
①第4行,1个空格;行数+空格数=5;空格数i=5-行数j
②长方形代码(3)for(;i<=5-j;)

        // (2)
        for (int j = 1; j <= 4; j++) {
            // (3)
            for (int i = 1; i <= 5 - j; i++) {
                System.out.print(" ");
            }
            // (1)
            for (int i = 1; i <= 9; i++) {
                System.out.print("*");
            }
            System.out.println();
        }

三角形 

 【4.3】三角形

①平行四边形基础上,去掉右边
②(2)、(3)不变
③第1行,打印1个;第2行,打印3个;第3行,打印5个;第4行,打印7个
==》行数j*2-1=打印数i
④平行四边形代码(1)for(;i<=2*j-1;)

        for (int j = 1; j <= 4; j++) {
            for (int i = 1; i <= 5 - j; i++) {
                System.out.print(" ");
            }
            // 1-1;2-3;3-5;4-7;==>行数*2-1=打印数
            for (int i = 1; i <= 2 * j - 1; i++) {
                System.out.print("*");
            }
            System.out.println();
        }

菱形 

【4.4】 实心菱形

法一:
①前4行为正三角形,后3行为倒三角形
②空格数:1-2;2-3;3-4;行数j+1=空格数i
③*数:1-5;2-3;3-1;2*行数j+打印数i=7

        for (int j = 1; j <= 4; j++) {
            // 空格
            for (int i = 1; i <= 5 - j; i++) {
                System.out.print(" ");
            }
            // 打印*
            for (int i = 1; i <= 2 * j - 1; i++) {
                System.out.print("*");
            }
            System.out.println();
        }
        for (int j = 1; j <= 3; j++) {
            for (int i = 1; i <= j + 1; i++) {
                System.out.print(" ");
            }
            for (int i = 1; i <= 7 - 2 * j; i++) {
                System.out.print("*");
            }
            System.out.println();
        }

 【4.5】 空心菱形

修改处: //打印* 

①头和尾打印*:i==1||i==2*j-1;下半i==1||i==7-2*j
②其余打印空格:if-else

菱形法二 

 【4.6】实心菱形
法二:
①打印正方形j<=size;i<=size;
②第1行开始于第3,结束于第3
②第2行开始于第2,结束于第4
②第3行开始于第1,结束于第5,初始化为第1行位置size/2+1
③当i >= startNum && i <= endNum时打印*,其余打印空格
④上半startNum--;endNum++;下半startNum++;endNum--;
⑤判断上下半:endNum==size

        int size = 9;
        boolean flag = true;
        // 每行打印*的起始与结束位置;初始化为第一行位置
        int startNum = size / 2 + 1;
        int endNum = size / 2 + 1;
        for (int j = 1; j <= size; j++) {
            for (int i = 1; i <= size; i++) {
                if (i >= startNum && i <= endNum) {
                    System.out.print("*");
                } else {
                    System.out.print(" ");
                }
            }
            System.out.println();
            // 打印的结束位置与尺寸一致,开始打印下半
            if (endNum == size) {
                flag = false;
            }
            if (flag) {
                startNum--;
                endNum++;
            } else {
                startNum++;
                endNum--;
            }
        }

【4.7】 空心菱形 法二

只打印头和尾 i == startNum || i == endNum

 解决二元一次方程问题

 【5.1】解决二元一次方程问题

1<=a<=5;3<=b<=6;求a+b=7的所有值

①二重循环int a=1;a<=5;a++和int b=3;b<=6;b++;打印所有匹配项a+"----"+b;逐一遍历两两组合结果;

②a+b==7限制打印项

        for (int a=1;a<=5;a++){
            for (int b=3;b<=6;b++){
                if (a+b==7){
                    System.out.println(a+"----"+b);
                }
            }
        }

 百钱买百鸡

 【5.2】百钱买百鸡:
公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,
用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。

//   公鸡x,母鸡y,小鸡z

// 【1】x+y+z=100只 【2】5x+3y+z/3=100文钱【3】z%3==0

        for (int x = 1; x <= 100; x++) {
            for (int y = 1; y <= 100; y++) {
                for (int z = 1; z <= 100; z++) {
                    if (x + y + z == 100 && 5 * x + 3 * y + z / 3 == 100) {
                        System.out.println("满足题意的有x:" + x + " y:" + y + " z:" + z);
                    }
                }
            }
        }

【3】3*5+20*3+77/3=15+60+25.66,所以z须是3的倍数 

 右图:x=1进入内层,y=1进入内层,z=1进入内层循环的每次迭代时,z 的值会递增至101跳出第三层循环。然而,由于第一层、第二层没有将 x、y 和 z 初始化为 1,x、y 和 z 的初始值将是上一次循环结束时的值。因此在后续的迭代中,x 和 y 的值保持不变,而 z 的值已经大于 100,不再满足内层循环的条件,内层循环无法再次进行迭代。

 上述代码,低层执行了100^3,效率低
优化:

①只有100钱,每种鸡至少一只,(100-3-1)/5=19.2;一百文钱买一只母鸡y,三只小鸡z,后全买公鸡x,最多19只

①(100-5-1)/3=31.3;一百文钱买一只公鸡x,三只小鸡z,后全买母鸡y,最多31只

①买一只公鸡和母鸡,所有鸡总数为100,故小鸡z最多有98只

②x和y确定后,z也确定了,不必再循环遍历结果;减少不必要的循环与循环次数,提升程序效率

        for (int x = 1; x <= 19; x++) {
            for (int y = 1; y <= 31; y++) {
                int z = 100 - x - y;
                if (5 * x + 3 * y + z / 3 == 100 && z % 3 == 0) {
                    System.out.println("满足题意的有x:" + x + " y:" + y + " z:" + z);
                }
            }
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值