从闰年判断到百钱百鸡

75 阅读2分钟

1. 闰年判断

题目要求:

从键盘输入一个年份,判断它是否是闰年

代码

object base09 {
  def main(args: Array[String]): Unit = {
    // 判断闰年
    /*
    1. 让用户输入一个整数,表示年份
    2. 判断这个年份是否是闰年  
    3. 输出结果
    */
    val year: Int = scala.io.StdIn.readInt()
    // 2000 ==> 2000是闰年
    // 2024 ==> 2024是闰年
    // 2025 ==> 2025不是闰年
    // 1900 ==> 1900不是闰年

    // 闰年规则:能被4整除但不能被100整除,或者能被400整除
    val result: Boolean = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)

    if (result) {
      println(s"$year 是闰年")
    } else {
      println(s"$year 不是闰年")
    }
  }
}

2. 分数序列求和

题目要求:

计算 s = 1 - 1/2 + 1/3 - 1/4 + 1/5 ... + 1/19 的值

代码

object base0801 {
  def main(args: Array[String]): Unit = {
    // 求 s = 1 - 1/2 + 1/3 - 1/4 + 1/5 ... 
    var sum: Double = 0
    var i = 1
    while (i <= 19) {
      if (i % 2 == 1) {
        sum = sum + 1.0 / i
      } else {
        sum = sum - 1.0 / i
      }
      i += 1
    }
    println(s"sum = $sum")
  }
}

3. 素数判断

题目要求:

从键盘输入一个数,判断它是否是素数

代码

import scala.util.control.Breaks.{break, breakable}

object base0802 {
  def main(args: Array[String]): Unit = {
    /*
    判断质数。
    * 质数:只能被1和它自己整除的数。
    */
    println("请输入一个整数:")
    val num = scala.io.StdIn.readInt()
    
    var isPrime = true
    if (num <= 1) {
      isPrime = false
    } else {
      breakable {
        for (i <- 2 until num) {
          if (num % i == 0) {
            isPrime = false
            break
          }
        }
      }
    }
    
    if (isPrime) {
      println(s"$num 是素数")
    } else {
      println(s"$num 不是素数")
    }
  }
}

4. 小球弹跳问题

题目要求:

小球从100米高处自由落下,每次弹回高度的一半,求经过多少次落地后弹起高度低于0.5米

代码

object base0803 {
  def main(args: Array[String]): Unit = {
    /**
    * 弹跳小球
    */
    var h: Double = 100
    var i = 0
    while (h >= 0.5) {
      i += 1
      h = h * 0.5
    }
    println(s"第$i 次落地后,高度是 $h")
  }
}

5. 复利计算

题目要求:

年化回报率10%,求第10年有多少元?多少年后能超过1000元?

代码

object base0804 {
  def main(args: Array[String]): Unit = {
    var i = 0
    var money = 1.0
    
    // 计算第10年的金额
    while (i < 10) {
      money = money * 1.1
      i = i + 1
    }
    println(s"第$i 年结束时,有 $money 元")
    
    // 重置计算超过1000元所需的年数
    i = 0
    money = 1.0
    while (money < 1000) {
      money = money * 1.1
      i = i + 1
    }
    println(s"第$i 年结束时,有 $money 元,超过1000元")
  }
}

6. 百鸡百钱问题

题目要求:

公鸡5文钱一只,母鸡3文钱一只,小鸡1文钱三只,用100文钱买100只鸡,问公鸡、母鸡、小鸡各多少只?

代码

object base1004 {
  def main(args: Array[String]): Unit = {
    // 百鸡百钱
    /**
    * 设公鸡 x, 母鸡 y 只, 小鸡是 100 - x - y.
    * 同时 0 <= x <= 20, 0<=y<=33
    *
    * 5x + 3y + (100 - x - y) / 3 = 100
    *
    * 暴力求解
    */
    var k = 0
    for (x <- 0 to 20) {
      for (y <- 0 to 33) {
        val z = 100 - x - y
        // 代入公式检查
        if (5 * x + 3 * y + z / 3.0 == 100) {
          k += 1
          println(s"$k: 公鸡$x只, 母鸡$y只, 小鸡$z只")
        }
      }
    }
  }
}

7. 乘法口诀表

题目要求:

输出9×9乘法口诀表

代码

object base1003 {
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 9) {
      for (j <- 1 to 9) {
        // 格式化输出,保持对齐
        printf("%d×%d=%-4d", j, i, i * j)
      }
      /**
      * %d: 占位符,会输出一个整数
      * %-4d: 占位符,会输出一个整数,一共占据4个字符位置,左对齐
      * %4d: 占位符,会输出一个整数,一共占据4个字符位置,右对齐
      */
      println() // 换行
    }
  }
}

总结 · while循环:适合不确定循环次数的场景 · for循环:适合已知循环范围的场景 · 嵌套循环:解决复杂的多维度问题 · 循环控制:使用break实现提前退出