本文章基于b站:BV1RK4y1g7A5 赵珊珊老师的java课程的学习加以个人理解做出的学习笔记整理。(p72-p77)
目录
输出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);
}
}
}