用Scala实现几个经典案例

这篇博客通过18个实例展示了Scala编程的应用,包括数字操作、逻辑判断、列表操作、时间延迟、质因数分解等多个方面,帮助读者深入理解Scala语言的特性和使用技巧。

实例1:

题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。

程序源代码:

object HelloWord {
  def main(args: Array[String]): Unit = {
    var num:Int=0
    for (i <- 1 to 4;j<- 1 to 4;k <- 1 to 4;if i !=j;if i != k ;if j != k ){
        print(s"${i}${j}${k} ")
        num +=1
    }
    println()
    println(s"能组成${num}个")
  }
}

 运行结果:


实例2:

题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

程序分析1:可以利用if判断语句

程序源代码:

object HelloWord {
  def main(args: Array[String]): Unit = {
    import scala.io.StdIn
    println("请输入利润:")
    val profit=StdIn.readFloat()
    if (profit <0) println("应发放的奖金为0元")
    if (profit >=0 && profit<100000)  println(s"应发放的奖金为${profit*0.1}")
    if (profit >=100000 && profit<200000)  println(s"应发放的奖金为${(profit-100000)*0.075+100000*0.1}")
    if (profit >=200000 && profit<400000)  println(s"应发放的奖金为${(profit-200000)*0.05+(200000-100000)*0.075+100000*0.1}")
    if (profit >=400000 && profit<600000)  println(s"应发放的奖金为${(profit-400000)*0.03+(400000-200000)*0.05+(200000-100000)*0.075+100000*0.1}")
    if (profit >=600000 && profit<1000000)  println(s"应发放的奖金为${(profit-600000)*0.015+(600000-400000)*0.03+(400000-200000)*0.05+(200000-100000)*0.075+100000*0.1}")
    if (profit>=1000000)  println(s"应发放的奖金为${(profit-1000000)*0.01+(1000000-600000)*0.015+(600000-400000)*0.03+(400000-200000)*0.05+(200000-100000)*0.075+100000*0.1}")
  }
}

程序分析2:可以利用数轴分界,定位。

程序源代码:

import scala.io.StdIn
object HelloWord {
  def main(args: Array[String]): Unit = {
    print("请输入利润:")
    var profit = StdIn.readFloat()
    val arr = List(1000000, 600000, 400000, 200000, 100000, 0)
    val rat = List(0.01, 0.015, 0.03, 0.05, 0.075, 0.1)
    var bonus: Float = 0
    for (i <- 0 to 5) {
      if (profit > arr(i)) {
        bonus += ((profit - arr(i).toFloat) * rat(i).toFloat)
        profit = arr(i).toFloat
      }
    }
    println(bonus)
  }
}

 运行结果:


 实例3:

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

程序分析:假设该数为 x。

1、则:x + 100 = n2, x + 100 + 168 = m2

2、计算等式:m2 - n2 = (m + n)(m - n) = 168

3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数

4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数。

5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数。

6、由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1。

7、接下来将 i 的所有数字循环计算即可。

程序源代码:

object HelloWord {
  def main(args: Array[String]): Unit = {
    var num=0
    for (i: Int <- 1 to 85) {
      if (168 % i == 0) {
        val j: Int = 168 / i
        if (i > j & (i + j) % 2 == 0 & (i - j) % 2 == 0) {
          val m = (i + j) / 2
          val n = (i - j) / 2
          num = n * m - 100
        }
      }
    }
    println(num)
  }
}

运行结果:


实例4: 

题目:输入某年某月某日,判断这一天是这一年的第几天?

程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于2时需考虑多加一天

程序源代码:

import scala.io.StdIn

object HelloWord {
  def main(args: Array[String]): Unit = {
    val year = StdIn.readInt()
    val month = StdIn.readInt()
    val day = StdIn.readInt()
    val months = List(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334)
    if (month > 0 && month <= 12) {
      var sum = months(month - 1) + day
      var leap = 0
      if (year % 400 == 0 || year % 4 == 0 || year % 100 != 0) {
        leap = 1
      }
      if (leap == 1 && month > 2) {
        sum += 1
      }
      println(s"这一天是这一年的第${sum}天")
    } else {
      println("输入有误!")
    }
  }
}

 运行结果:


案例5:

题目:输入三个整数x,y,z,请把这三个数由小到大输出。

程序分析:把三个整数放在列表里,然后用列表的sorted方法进行升序排序。

程序源代码:

import scala.io.StdIn

object hello2 {
  def main(args: Array[String]): Unit = {
    var list:List[Int]=Nil
    for ( n <- "xyz"){
      print(s"请输入${n}:")
      val num =StdIn.readInt()
      list=list:+num
    }
    println(list.sorted)
  }
}

 运行结果:


案例6:

题目:输出第n个斐波那契数列。

程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。

import scala.io.StdIn

object hello3 {
  def main(args: Array[String]): Unit = {
    print("请输入n:")
    val n = StdIn.readInt()
    var a = 1
    var b = 1
    var c = 0
    for (i <- 0 until n) {
      print(s"${a} ")
      c = a + b
      a = b
      b = c
    }
    println()
    println(s"第${n}个斐波那契数为${b - a}")
  }
}

运行结果:


案例7:

题目:将一个列表的数据复制到另一个列表中。

程序源代码:

object hello3 {
  def main(args: Array[String]): Unit = {
    val a=List(1,2,3)
    val b =a
    println(b)
  }
}

运行结果:


案例8:

题目:输出 9*9 乘法口诀表。

程序分析:分行与列考虑,共9行9列,i控制行,j控制列。

程序源代码:

object hello3 {
  def main(args: Array[String]): Unit = {
    for (i <- 1 to 9){
      for (j <- 1 to i){
        print(s"${j}*${i}=${j*i} ")
      }
      println()
    }
  }
}

运行结果:


案例9:

题目:暂停一秒输出。

程序分析:可以延迟main函数

程序源代码:

object hello2 {
  val list=List(1,2,3)
  println(list)
  def main(args: Array[String]): Unit = {
    Thread.sleep(1000)//延迟main进程一秒
    println(list)
  }
}

运行结果:


 案例10:

题目:暂停一秒输出,并格式化当前时间。

程序源代码:

import java.text.SimpleDateFormat
import java.util.Date

object hello2 {
  val t=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date)
  println(t)
  def main(args: Array[String]): Unit = {
    Thread.sleep(1000)//延迟main进程一秒
    val time=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date)
    println(time)
  }
}

运行结果:


案例11: 

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....

程序源代码:

object hello2 {
  def main(args: Array[String]): Unit = {
    var f1 = 1
    var f2 = 1
    for (i <- 1 to 21) {
      printf("%12d ", f1)
      printf("%12d ", f2)
      if (i%3==0) println()
      f1+=f2
      f2+=f1
    }
  }
}

运行结果:


 案例12:

题目:判断101-200之间有多少个素数,并输出所有素数。

程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。      

程序源代码:

import util.control.Breaks._
object hello2 {
  def main(args: Array[String]): Unit = {
    var h=0
    for (i <-101 to 200){
      breakable{
        for (j <- 2 until i) {
          if (i % j == 0) break
          h+=1
          if (h==i-2){
            println(i)
            h=0
          }
        }
      }
    }
  }
}

运行结果:


案例13:

题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

程序源代码:

object hello2 {
  def main(args: Array[String]): Unit = {
    for (i <- 100 to 999) {
      val a = i / 100 % 10
      val b = i / 10 % 10
      val c = i % 10
      if (a*a*a+b*b*b+c*c*c==i) println(i)
    }
  }
}

运行结果:


案例14:

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

程序源代码:

import scala.io.StdIn

object hello2 {
  def main(args: Array[String]): Unit = {
    println("请输入一个整数:")
    var a = StdIn.readInt()
    print(a + " = ")
    var s = 0
    for (i <- 2 until a) {
      while (a % i == 0) {
        s += 1
        a = a / i
        if (s == 1) {
          print(i)
        } else {
          print(" * " + i)
        }
      }
    }
  }
}

运行结果:


案例15:

题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

程序分析:用if语句判断

程序源代码:

import scala.io.StdIn

object hello2 {
  def main(args: Array[String]): Unit = {
    print("请输入分数:")
    val num=StdIn.readInt()
    if (num >= 90) {
      println(s"${num}属于A")
    }else if(num >=60){
      println(s"${num}属于B")
    }else{
      println(s"${num}属于C")
    }
  }
}

运行结果:


案例16:

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

程序分析:可以采用正则表达式提取想要的字符

程序原代码:

import scala.io.StdIn
import scala.util.matching.Regex

object hello2 {
  def main(args: Array[String]): Unit = {
    print("请输入字符串:")
    val num=StdIn.readLine()
    val pattern =new Regex("([a-z]|[A-Z])")
    val char=(pattern findAllIn num).mkString("")
    println("英文字母有"+char.length+"个")
    val kongbai=new Regex("\\s")
    val kb=(kongbai findAllIn num).mkString("")
    println(s"空格有${kb.length}个")
    val shuzi=new Regex("\\d")
    val shzi=(shuzi findAllIn num).mkString("")
    println(s"数字有${shzi.length}个")
    val qita=new Regex("([^a-zA-Z0-9] | \\S)")
    val qt=(qita findAllIn num).mkString("")
    println(s"其他字符有${qt.length}个")
  }
}

运行结果:


案例17:

题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。

程序分析:关键是计算出每一项的值。

程序源代码:

import scala.io.StdIn

object hello2 {
  def main(args: Array[String]): Unit = {
    println("请输入a")
    var a = StdIn.readInt()
    println("请输入n")
    var n = StdIn.readInt()
    var sum = 0
    var a2 = a
    for (i <- 0 until n){
      var num = math.pow(10,i).toInt;
      if (i!=0){
        a2 += a*num
      }
      sum+=a2
    }
    print(sum)
  }
}

运行结果:


案例18:

题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。

程序源代码:

object WangShu extends App {
  println("1到1000 的完数有:")
  val iList = for(i <- 1 to 1000 if isWangShu(i)) yield i
  println(iList.mkString(" "))
  def isWangShu(i:Int): Boolean = {
    var num = 0
    for (j <- 1 to i / 2) {
      if (i % j == 0) num += j
    }
    if (i==num) true else false
  }
}

运行结果:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值