Java\Scala\Python三种语言求解经典编程实例(一)——求水仙花数

本文介绍如何用Java, Scala和Python在Linux环境下解决水仙花数问题。水仙花数是每位数字的n次幂之和等于其本身的n位数。文章提供100~999间的水仙花数的代码实现,包括Java的严谨实现,Scala的简洁map函数应用,以及Python的解决方案。" 138925900,8204070,Android 14.0 自动授予OP_REQUEST_INSTALL_PACKAGES权限,"['Android开发', '权限管理', '安装权限']

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

三种语言求解经典编程实例,全部是在Linux下编码实现的。

配置参数文章: 快速配置Linux下的编程环境变量

Linux下运行Python的文章:

安装Python交互式数据处理工具——IPython

Linux下创建并执行python脚本


水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。水仙花数只是自幂数的一种,严格来说三位数的3次幂数才成为水仙花数。
例如:1^3+5^3+3^3=153。
求100~999之间所有的水仙花数。


1、Java代码实现,这是最经典也是最实用的方式,编码风格严谨

import java.util.*;
public class ArmStrongNum{
        public static void main(String[] args){
                for(int i = 100 ; i <= 100000 ; i++){
                        if(isArmstrongNumber(i)){
                                System.out.println(i);
                        }
                }
        }

        public static boolean isArmstrongNumber(int n){
                List<Integer> a = new ArrayList<Integer>();
                int t = n;
                while ( t > 0){  // 循环找找到每一位数的值 个位 十位 百位
                        a.add(t % 10);
                        t /= 10;
                }
                int k = a.size(); //列表的长度即为幂次数
                int s = 0;
 
                for(int x : a){
                        s += Math.pow(x,k); //通过Math函数来求解幂
                }
                return s == n;  // 如果各位数的幂相加等于原数则返回true
        }
}


2、Scala代码实现,简洁明了,通过强大的map函数操作集合中的元素

import scala.collection.mutable._  //声明引用,可变长度的集合
object ArmStrongNum extends App{
        def isArmStrongNumber(n:Int):Boolean={
                val a = ArrayBuffer[Int]()
                var t = n
                while ( t > 0){  // 循环找找到每一位数的值 个位 十位 百位
                        a += t % 10
                        t = t/10.toInt
                }
                val k = a.length
                a.map(x => math.pow(x,k)).sum == n   //scala语言的特点,使用map函数分别操作集合元素,并求合
        }

        for ( x <- 100 to 100000)
                if (isArmStrongNumber(x)) println(x)
}

说明,执行scala代码的方式:

1、编译 

scalac ArmStrongNum.scala
2、执行编译结果

scala ArmStrongNum
需要配置classpath的指向

export  CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:.


或者使用 -cp 参数来指定 classpath的路径

scala -cp ./ ArmStrongNum



3、Python代码实现,直观易懂,最少的代码实现最优的解法,利用强大的列表解析功能简化代码

def isArmstrongNumber(n):
    a = []
    t = n
    while t > 0:  #循环找找到每一位数的值 个位 十位 百位
        a.append(t % 10)
        t /= 10
    
    k = len(a)

    return sum([x ** k for x in a]) == n  #Python语言的特点 列表解析


for x in range(100,100000):
    if isArmstrongNumber(x): print x


最后返回的结果三种语言求解都是一致的:

153
370
371
407
1634
8208
9474
54748
92727
93084


### 实现从给定组中筛选出所有水仙花 为了实现在给定组中找到所有的水仙花的功能,可以定义个函来检查单个字是否为水仙花,并利用此函遍历整个组。下面是个具体的实现方案: ```scala object NarcissisticNumbersFinder { // 定义个方法用于检测某个三位是不是水仙花 def isNarcissisticNumber(num: Int): Boolean = { if (num >= 100 && num <= 999) { val a = num / 100 // 获取百位上的值 val b = (num / 10) % 10 // 获取十位上的值 val c = num % 10 // 获取个位上的值 // 判断三个位置上字的立方和是否等于原 a * a * a + b * b * b + c * c * c == num } else false // 如果不是三位则返回false } // 定义个方法接收个整型组作为参,返回个新的只含有水仙花的列表 def findNarcissisticNumbersInArray(numbers: Array[Int]): List[Int] = { numbers.filter(isNarcissisticNumber).toList } def main(args: Array[String]): Unit = { // 测试据 val testData = Array(153, 278, 370, 407, 567) // 调用findNarcissisticNumbersInArray获取测试据中的水仙花 val result = findNarcissisticNumbersInArray(testData) // 打印结果 println(s"Found narcissistic numbers are $result") } } ``` 上述代码首先创建了个名为`isNarcissisticNumber`的方法用来验证传入的整是否属于水仙花[^1]。接着实现了另个叫作`findNarcissisticNumbersInArray`的方法,它接受个整型组作为输入参,并通过调用前面提到的辅助方法过滤掉非水仙花,最终返回仅包含符合条件项的新列表。 最后,在`main`函里提供了组测试据来进行功能演示,展示了如何使用这两个自定义的方法来查找指定范围内的水仙花[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值