水仙花数问题:
某个三位数的各个位的三次方加起来的和,如果等于这个数本身,那么这个数就是水仙花数。
这个题作为编程新手必做的练习题,我就不多说了。不过不满足于程序的死板,于是想找找任意位数的数字的水仙花数,talk is cheap,show you the code !(语言选择Java,计算了10亿以内的水仙花数)
public class ShuiXianHuaDemo {
public static void main(String[] args) {
// 普通问题,求100-999的水仙花数
method1();
System.out.println("----------------");
// 进阶问题:求1000到9999的水仙花数
method2();
System.out.println("----------------");
// 终极问题:求任意位数的所有水仙花数
for (int i = 1; i < 1000000000; i++) {
// 调用qiuhe(i)方法,计算数字i的各个数位的n次方和,n为这个数的位数
if (i == qiuhe(i)) {
System.out.println(i);
}
}
}
// 求和方法
private static int qiuhe(int i) {
int sum = 0;// sum变量用于存放最后要返回的次方和
int bit = 0;// bit变量用于保存这个数字是多少位
int temp;// temp变量用于临时存放这个数字的某一位的bit次和
// 先一个循环计算多少数字有多少位,将用确定乘数个数
for (int j = i; j != 0; j = j / 10) {
bit++;
}
// 外层for循环:每次执行每一位上的次方和
for (int j = i; j > 0; j = j / 10) {
int shu = j % 10;// shu变量用于临时存放某一位上的数字是多少
temp = shu;// 将shu赋值给temp,用于临时计算每次
// 用循环的方式计算n-2次,shu位上的乘积之和,循环bit-1次即可求出bit个shu的乘积
for (int n = 1; n < bit; n++) {
temp = temp * shu;
}
// 将计算出的temp交给sum,作为一位的结果,然后继续做下一位,直到所有位数的次方和全部累加到sum
sum = sum + temp;
}
// 将最后结果返回
return sum;
}
private static void method2() {
for (int i = 1000; i < 10000; i++) {
int j = i;
int g = j % 10;// g代表个位
j = j / 10;
int s = j % 10;// s代表十位
j = j / 10;
int b = j % 10;// b代表百位
j = j / 10;
int he = g * g * g * g + s * s * s * s + j * j * j * j + b * b * b * b;
if (i == he) {
System.out.println(i);
}
}
}
private static void method1() {
for (int j = 100; j <= 999; j++) {
int i = j;
int g = i % 10;
i = i / 10;
int s = i % 10;
int b = i / 10;
if ((g * g * g + s * s * s + b * b * b) == j) {
System.out.println(j);
}
}
}
}
最终运行结果:
153
370
371
407
----------------
1634
8208
9474
----------------
1
2
3
4
5
6
7
8
9
153
370
371
407
1634
8208
9474
54748
92727
93084
548834
1741725
4210818
9800817
9926315
24678050
24678051
88593477
146511208
472335975
534494836
912985153