Java算法之“水仙花数”

打印出所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数本身。

分析:水仙花数首先是个三位数,即在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

你可能感兴趣的:(java)