黑马程序员技术交流社区

标题: 一个水仙花算法引发的故事 [打印本页]

作者: theape    时间: 2016-8-15 15:03
标题: 一个水仙花算法引发的故事
本帖最后由 theape 于 2016-8-15 15:04 编辑

求一个整数的位数以及得到对应位的数
思路:
被除数 / 除数 = 商 余数
余数在计算机中被称之为模
从小位到大位,最小位是个位;
除以10取商可以作为新的数,取模可以得到个位数。
建议新的数强转为整数。
经过循环取商可以得到位数,每次取模可以得到对应位数。
方法代码如下:
[Java] 纯文本查看 复制代码
        public static void getCount(int num) {
                if (num == 0) {
                        System.out.println("0是个1位数");
                        return;        
                }
               
                int n = 0;                        // 代表位数
                int temp = num;                // temp代表每次循环得到的新的数
                int unit;                        // 代表当前位的数
               
                while (temp > 0) {
                        unit = temp % 10;        //得到当前数的个位数
                        temp = temp / 10;  //从十位开始得到新的数
                        n++;
                        System.out.println("第" + n + "位的数是:" + unit);
                }
               
                System.out.println(num + "是个" + n + "位数");
        }

调用方法 getCount(412415); 运行结果是:
第1位的数是:5
第2位的数是:1
第3位的数是:4
第4位的数是:2
第5位的数是:1
第6位的数是:4
412415是个6位数

while 的判断条件temp>0或temp>=1都可,因为最高位至少是1;

这个方法的应用就是计算水仙花数,代码如下:当然这个代码不完善的地方是不管你输入的是几位数,实际上只是计算3位数的水仙花数,因为是当前位数的3次方(0和1除外)

[Java] 纯文本查看 复制代码
        public static void printNum(int num) {

                int temp = num;
                int unit;
                int sum = 0;
               
                while (temp > 0) {
                        unit = temp % 10;
                        temp = temp / 10;
                        sum = sum + unit * unit * unit;
                }
                if (num == sum) {
                        System.out.println(num);
                }
        }
}


下面来个广义上的水仙花数,这个数 = 每位数的总位数次方的和。比如:
1 = 1^1
153 = 1^3 + 5^3 + 3^3
8208 = 8^4 + 2^4 + 0^4 + 8^4
上代码:

[Java] 纯文本查看 复制代码
        public static void main(String[] args) {
                for (int i = 0; i <= 10000; i++) {
                        printNum(i);
                }
                getCount(412400);
        }
        
        public static void printNum(int num) {
               
                int n = 0;                        // 保持总位数
                int temp = num;
                while (temp > 0) {
                        temp = temp / 10;
                        n++;                        // 先计算总位数
                }
               
                temp = num;
                int[] arr = new int[n];  //拿出每一位的数保存到数组中,arr[0]代表个位数
                int sum = 0;                //         求乘方和
               
                for (int i = 0; i < n; i++) {
                        arr = temp % 10;
                        int involution = 1;                        //求乘方
                        for (int j = 1; j <= n; j++) {
                                involution = involution * arr;
                        }
                        sum = sum + involution;
                        temp = (int)(temp / 10);        // 不带int也可以强转
                }
                if (num == sum) {
                        System.out.println("水仙花数:" + num);
                }
        }
        

运行结果:
水仙花数:0
水仙花数:1
水仙花数:2
水仙花数:3
水仙花数:4
水仙花数:5
水仙花数:6
水仙花数:7
水仙花数:8
水仙花数:9
水仙花数:153
水仙花数:370
水仙花数:371
水仙花数:407
水仙花数:1634
水仙花数:8208
水仙花数:9474



作者: 橘子哥    时间: 2016-8-15 15:10
真司机又来发帖啦!!!
作者: RongJiao    时间: 2016-8-15 16:30
有点意思。判断位数的想法很6
作者: RongJiao    时间: 2016-8-15 16:30
有点意思。判断位数的想法很6




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2