一,多重循环
说明:
1.for可以替换成while循环。
2.循环的嵌套可以有多个,数量不限。
3.里外层循环执行的次数不相同。
object day14 {
def main(args: Array[String]): Unit = {
var k = 0
for(i <- 0 to 5){ // 外层循环
println(i) // 输出几次? 它由哪个循环变量的值所定?
for(j <- 11 to 20){ // 内层循环
println(k,i,j) //输出几次? 它由哪个循环变量的值所定?
}
}
}
}
如何得知以上 println 输出几次?
解答:
for(i <- 0 to 5) 0-5输出6次 0,1,2,3,4,5
for(j <- 11 to 20) 输出10次
11,12,13,14,15,16,17,18,19,20
再用输出6次乘以10次 6*10=60
可以得出 for(j <- 11 to 20) 输出60次
例题1:
1,
1
22
333
4444
55555
要求:
1.每行的数字个数都不相同,完成一行输出之后可以换行。
2.使用外层循环控制每行的重复次数,使用内层循环控制每行的具体内容。
修改如下:
得出结果:
2,打印乘法口诀表
object day16 {
def main(args: Array[String]): Unit = {
for(i <- 1 to 9){
for(j <- 1 to 9){
// printf(s"${j]*${i}=${i*j]")
printf("%d*%d=%-4d",j,i,i*j)
/**
* %d: 占位符,会输出一个整数
* %-4d: 占位符,会输出一个整数,一共占据4个字符的空间大小,左对齐
* %4d: 占位符,会输出一个整数,一共占据4个字符的空间大小,右对齐
*/
}
println() // 换行
}
}
}
拓展:使用printf("%d×%d=%-5d",i,j i*j) 可以更整齐地打印。
结果:
如何使打印出的结果和乘法表一样向下对齐?修改这个代码
修改如下:
object day16 {
def main(args: Array[String]): Unit = {
for(i <- 1 to 9){
for(j <- 1 to i){
// printf(s"${j]*${i}=${i*j]")
printf("%d*%d=%-4d",j,i,i*j)
/**
* %d: 占位符,会输出一个整数
* %-4d: 占位符,会输出一个整数,一共占据4个字符的空间大小,左对齐
* %4d: 占位符,会输出一个整数,一共占据4个字符的空间大小,右对齐
*/
}
println() // 换行
}
}
}
输出结果:
例题3:
公鸡(鸡翁)1只,价格5钱;
母鸡(鸡母)1只,价格3钱;
小鸡(鸡雏)3只,价格1钱(即1钱买3只小鸡);
用100钱买100只鸡,问公鸡、母鸡、小鸡各有多少只?
object day17 {
def main(args: Array[String]): Unit = {
// 百鸡百钱
/**
* 设公鸡x,母鸡y只,小鸡是100-x-y
* 同时 0 <= x <=20,0<=y<=33
*
* 5x+3y + (100-x-y)/3 = 100 (1)
*
* 暴力求解
* 1, (0,0,100) 代入 (1)看看是否成立?
* 2, (0,1,99) 代入 (1)看看是否成立?
* ...
* 34, (0,33,37) 代入(1)看看是否成立?
*/
var k = 0
for(x <- 0 to 20){
for(y <- 0 to 33){
val z = 100 -x -y
// 代入(1)
if(5*x + 3*y + z/3 == 100){
k += 1
println(k,x,y,z)
}
}
}
}
}