这篇文章讲述的是算法趣味整数部分的阿姆斯克朗数问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。
问题描述
所谓的“阿姆斯特朗数”是指一个三位数其各位数字的立方和等于该数本身,例如,153是“水仙花数”,因为153=1*1*1 + 5*5*5 + 3*3*3,需要注意的是阿姆斯特朗数与水仙花数的区别是阿姆斯特朗数没有位数限制,因此需要把每一位分离出来计算
算法分析
只需要将数拆分到一个数组中,在计算立方和,最后将立方和与该数做判断即可,若相同则是阿姆斯特朗数
代码实现
package funnyInteger;
/**
* @author 叶清逸
* @date 2018年7月14日上午12:21:33
* @version 1.0
* @project funnyInteger
*/
public class Q6_ArmstrongNumber {
/**
* 问题描述:所谓的“阿姆斯特朗数”是指一个三位数其各位数字的立方和
* 等于该数本身,例如,153是“阿姆斯特朗数”,因为153=1*1*1 + 5*5*5 + 3*3*3
*
* 算法分析:只需要将数拆分到一个数组中,在计算立方和,最后将立方和与该数做判断即可,
* 若相同则是阿姆斯特朗数
*/
public static void main(String[] args) {
/*假设判断范围为100~999,循环判断*/
int start = 100 ;
int end = 1000 ;
System.out.println(start+"~"+end+"之间的阿姆斯特朗数有:");
int num = 0 ; //个数
for(int i=start ; i<=end ; i++){
/*将数的每一位都拆分到数组中*/
int arr[] = numToArr(i) ;
/*计算每一位的立方和*/
int sum = 0 ;
for(int j : arr){
sum += j*j*j ;
}
/*判断每一位的立方和与原数是否相等,若相等则判断位阿姆斯特朗数,输出*/
if(i == sum){
System.out.print(i+" ");
num ++ ;
}
}
System.out.println();
System.out.println("共"+num+"个");
}
/*求参数number的长度*/
private static int getLength(Integer number){
int length = 1 ;
while(number/10>0){
length++ ;
number /= 10 ;
}
return length ;
}
/*将数字的每一位拆分后存入数组中*/
private static int [] numToArr(int num){
/*获取数字的长度*/
int length = getLength(num) ;
/*初始化存放结果的数组*/
int arr[] = new int [length] ;
/*计算底数用于取出每一位的数*/
int a = 1 ;
for(int j=0 ; j<length ; j++)
a *= 10 ;
int i = 0 ; //存放索引
while(a/10 > 0){
arr[i] = (num%a)/(a/10) ;
a /= 10 ;
i++ ;
}
return arr ;
}
}
样例输出
100~1000之间的阿姆斯特朗数有:
153 370 371 407
共4个