这篇文章讲述的是算法趣味整数部分的水仙花数问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。
问题描述
输出所有的“水仙花数”,所谓的“水仙花数”是指一个三位数其各位数字的立方和等于该数本身,例如,153是“水仙花数”,因为153=1*1*1 + 5*5*5 + 3*3*3
算法分析
只需要将数拆分计算立方和,最后将立方和与该数做判断即可,若相同则是水仙花数
代码实现
package funnyInteger;
/**
* @author 叶清逸
* @date 2018年7月13日下午11:57:10
* @version 1.0
* @project funnyInteger
*/
public class Q5_NarcissusNumber {
/**
* 问题描述:输出所有的“水仙花数”,所谓的“水仙花数”是指一个三位数其各位数字的立方和
* 等于该数本身,例如,153是“水仙花数”,因为153=1*1*1 + 5*5*5 + 3*3*3
*
* 算法分析:只需要将数拆分到一个数组中,在计算立方和,最后将立方和与该数做判断即可,
* 若相同则是水仙花数
*/
public static void main(String[] args) {
/*假设判断范围为100~999,循环判断*/
int start = 100 ;
int end = 999 ;
System.out.println(start+"~"+end+"之间的水仙花数有:");
int num = 0 ; //个数
for(int i=start ; i<=end ; i++){
/*求出该数的长度*/
int length = getLength(i) ;
/*求出底数a方便取出每一位数*/
int a = 1 ;
for(int j=0 ; j<length ; j++)
a *= 10 ;
int sum = 0 ; //用于存放立方和
/*计算每一位的立方和*/
while(a/10 > 0){
/*取出数*/
int k = (i%a)/(a/10) ;
/*计算立方和*/
sum += k*k*k ;
a /= 10 ;
}
/*判断每一位的立方和与原数是否相等,若相等则判断位水仙花数,输出*/
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 ;
}
}
样例输出
100~999之间的水仙花数有:
153 370 371 407
共4个