打印出所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
分析:水仙花数首先是个三位数,即在100-999这个范围内选出所谓的“水仙花数”,然后各个位数分别进行立方运算,然后再求和,并且等于其本身。
- 思路一
假设一个水仙花数为i,先将其各个位上的数依次摘出来,然后求平方和,即,i/100=a为百位上的数,(i-ax100)/10=b为十位上的数,(i-ax100-bx10)=c为个位上的数。反映在代码上为:
for (int i = 100; i <= 999; i++) {
int a = i / 100;
int b = (i - a * 100) / 10;
int c = i - a * 100 - b * 10;
int d = a * a * a + b * b * b + c * c * c;
if (i == d) {
return i;
}
}
- 思路二
思路一的做法是从整体往局部推进,知道这个三位数,然后再求出各位数,然后立方求和;还有一种思路是已知各个位数的值,然后求出这个三位数,由局部到整体,思路正好相反,即,水仙花数是100-999范围内的数,百位的范围是1-9,十位的范围是0-9,个位的范围是0-9,在代码中使用三层嵌套循环,依次遍历完100-999这个范围内的所有数,然后摘出所谓的水仙花数,反映在代码上是这样的:
for (int i = 1; i <= 9; i++) {
for (int j = 0; j <= 9; j++) {
for (int k = 0; k <= 9; k++) {
int count1 = i * 100 + j * 10 + k;
int count2 = i * i * i + j * j * j + k * k * k;
if (count1 == count2) {
System.out.print(count1 + ",");
}
}
}
}
显然第二种思路并不合常规,而且还显得麻烦,不如第一种思路那么顺溜,不过,在这里提供第二种思路的目的是,在写算法的时候,有时候一种思路不通的话,换一种角度可能就轻松的解决了,^_^~
END