相信所有编程语言的初学者都会做过这样一道题:
求出所有“水仙花"数并输出,水仙花数是指一个三位数,其各位数字的立方和确好等于该数本身,如153=111+555+333.
实际上,水仙花数属于自幂数的一种,即各位数的位数次幂和等于本身。
不同位数的自幂数也有不同的名称
一般我们会建立一个循环遍历100到999,然后将个十百为拆分然后检测。
for(int 1=100;i<1000;i++){
int gw=i%10; //存放个位数
int sw=i%100/10; //存放十位数
int bw=i/100; //存放百位数
if(i==(gw*gw*gw+sw*sw*sw+bw*bw*bw)){
System.out.println(i);
}
完成程序我就想,为什么不直接实现求自幂数?不限定位数,比如求出0~9999999的所有自幂数。
为了完成这个小目标,我们需要理清思路。
输入任意一个数字n,我们首先要确定它的位数,便于之后的计算判定。
int tmp=n;
int count=0; //位数计数器
while(tmp!=0){
count++;
tmp=tmp/10;
}
这样可以的到该数的位数count,然后是确定每一位上的数并计算幂数和。
int sum=0 //存放次幂和
tmp=n;
while (tmp != 0) {
sum = sum + (int)Math.pow(tmp%10,count); // Math.pow(a,b); a^b
//Math.pow(a,b)函数中,参数a,b均为double类型,需强制转换
tmp = tmp/10;
}
最后进行判断
if(sum == n)
{
System.out.println(i);
}
完整代码如下
public static void waterFlower(int n) {
for (int i = 0; i <= n; i++) {
int sum = 0;//保存每一位数字的次方和
int count = 0;//记录当前数字的位数
int tmp = i;
//求i是几位数
while (tmp != 0) {
count++;//1 2 3
tmp = tmp/10;//12 1 0
}
tmp = i;
//求tmp的每一位上的数字 123
while (tmp != 0) {
sum = sum + (int)Math.pow(tmp%10,count);
// Math.pow(a,b); a^b
tmp = tmp/10;
}
if(sum == i) {
System.out.println(i);
}
}
}
这样只要在主函数中调用函数waterFlower()并输入最大范围值n即可得到范围内的自幂数了。