Scala基础练习 实现水仙花数

此篇博客介绍了如何使用Scala编程语言来找出100到999之间的水仙花数,即其个位、十位和百位数字立方和等于该数本身的数字。通过循环遍历并验证条件,博主展示了如何运用编程解决数学问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

水仙花数是指其个位、十位、百位3个数的立方和等于这个数本身,请用Scala编程求出100~999之间的所有水仙花数。

object shuixianhua {
  def main(args: Array[String]): Unit = {
    for(i <- 100 to 999){
      var ge = i%100%10
      var shi = i/10%10
      var bai = i/100
      if(ge*ge*ge +shi*shi*shi +bai*bai*bai==i){
        println(i)
      }
    }
  }
}

<think>我们已知水仙花是指一个n位(n≥3),它的每个位上的字的n次幂之和等于它本身。 特别地,对于三位,即100到999之间的水仙花,满足:abc = a^3 + b^3 + c^3,其中a、b、c分别是百位、十位、个位上的字。 根据引用[1][2][3]中的示例,我们可以采用以下步骤: 1. 遍历100到999之间的所有整。 2. 对于每个整,分别提取出百位、十位和个位字。 3. 计算这三个字的立方和,并与原比较。 4. 如果相等,则输出该。 另外,引用[2]还提供了另一种方法,即使用组来存储每一位字,然后计算每一位的n次方(这里n=3)的和,再与原比较。 由于题目要求使用Scala,我们将编一个简单的程序。 注意:我们也可以编一个更通用的函来处理任意位水仙花(也称为自幂),但根据问题,目前只需要三位。 以下是一个简单的实现:</think>### Scala 实现水仙花计算 水仙花(Narcissistic number)是指一个 $n$ 位的各位字的 $n$ 次方之和等于该本身。对于三位($n=3$),需满足: $$ abc = a^3 + b^3 + c^3 $$ 其中 $a$ 是百位字,$b$ 是十位字,$c$ 是个位字。 #### 方法一:直接值计算(推荐) ```scala object NarcissisticNumber { def main(args: Array[String]): Unit = { // 遍历100到999的所有三位 (100 to 999).foreach { num => val hundreds = num / 100 // 获取百位字 val tens = (num % 100) / 10 // 获取十位字 val units = num % 10 // 获取个位字 // 检查是否为水仙花 if (math.pow(hundreds, 3) + math.pow(tens, 3) + math.pow(units, 3) == num) { println(s"$num 是水仙花") } } } } ``` **输出结果**: ``` 153 是水仙花 370 是水仙花 371 是水仙花 407 是水仙花 ``` #### 方法二:通用字分解法 ```scala object NarcissisticNumber { def main(args: Array[String]): Unit = { (100 until 1000).foreach { num => var temp = num var sum = 0 // 分解字的每一位并计算立方和 while (temp > 0) { val digit = temp % 10 sum += math.pow(digit, 3).toInt temp /= 10 } if (sum == num) println(num) } } } ``` #### 关键步骤说明: 1. **字分解**: - 百位:`num / 100`(整除运算) - 十位:`(num % 100) / 10`(取模后整除) - 个位:`num % 10`(直接取模) 2. **学计算**: - 使用 `math.pow(digit, 3)` 计算立方值 - 立方和需严格等于原字 #### 性能说明 两种方法在三位场景下性能相当,但方法一直接操作字位更易读。若扩展到更高位(如四位的四叶玫瑰),方法二的通用性更强[^1][^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值