三种语言求解经典编程实例,全部是在Linux下编码实现的。
配置参数文章: 快速配置Linux下的编程环境变量
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