用Scala实现几个经典案例
实例1:
题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
程序源代码:
object HelloWord {def main(args: Array[String]): Unit = {var num:Int=0for (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.StdInprintln("请输入利润:")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 = 0for (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=0for (i: Int <- 1 to 85) {if (168 % i == 0) {val j: Int = 168 / iif (i > j & (i + j) % 2 == 0 & (i - j) % 2 == 0) {val m = (i + j) / 2val n = (i - j) / 2num = n * m - 100}}}println(num)}
}
运行结果:

实例4:
题目:输入某年某月某日,判断这一天是这一年的第几天?
程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于2时需考虑多加一天
程序源代码:
import scala.io.StdInobject 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) + dayvar leap = 0if (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.StdInobject hello2 {def main(args: Array[String]): Unit = {var list:List[Int]=Nilfor ( 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.StdInobject hello3 {def main(args: Array[String]): Unit = {print("请输入n:")val n = StdIn.readInt()var a = 1var b = 1var c = 0for (i <- 0 until n) {print(s"${a} ")c = a + ba = bb = c}println()println(s"第${n}个斐波那契数为${b - a}")}
}
运行结果:

案例7:
题目:将一个列表的数据复制到另一个列表中。
程序源代码:
object hello3 {def main(args: Array[String]): Unit = {val a=List(1,2,3)val b =aprintln(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.Dateobject 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 = 1var f2 = 1for (i <- 1 to 21) {printf("%12d ", f1)printf("%12d ", f2)if (i%3==0) println()f1+=f2f2+=f1}}
}
运行结果:

案例12:
题目:判断101-200之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
程序源代码:
import util.control.Breaks._
object hello2 {def main(args: Array[String]): Unit = {var h=0for (i <-101 to 200){breakable{for (j <- 2 until i) {if (i % j == 0) breakh+=1if (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 % 10val b = i / 10 % 10val c = i % 10if (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.StdInobject hello2 {def main(args: Array[String]): Unit = {println("请输入一个整数:")var a = StdIn.readInt()print(a + " = ")var s = 0for (i <- 2 until a) {while (a % i == 0) {s += 1a = a / iif (s == 1) {print(i)} else {print(" * " + i)}}}}
}
运行结果:

案例15:
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
程序分析:用if语句判断
程序源代码:
import scala.io.StdInobject 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.Regexobject 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.StdInobject hello2 {def main(args: Array[String]): Unit = {println("请输入a")var a = StdIn.readInt()println("请输入n")var n = StdIn.readInt()var sum = 0var a2 = afor (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 iprintln(iList.mkString(" "))def isWangShu(i:Int): Boolean = {var num = 0for (j <- 1 to i / 2) {if (i % j == 0) num += j}if (i==num) true else false}
}
运行结果:

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
