LintCode 147.水仙花数 N位自幂数

  • 描述

水仙花数的定义是,这个数等于他每一位上数的幂次之和 见维基百科的定义

比如一个3位的十进制整数153就是一个水仙花数。因为 153 = 13 + 53 + 33。

而一个4位的十进制数1634也是一个水仙花数,因为 1634 = 14 + 64 + 34 + 44。

给出n,找到所有的n位十进制水仙花数。

你可以认为n小于8。

. 样例

	 . Example 1:
		Input: 1
		Output: [0,1,2,3,4,5,6,7,8,9]


	Example 2:
		Input:  2
		Output: []

	Explanation: 
	There is no Narcissistic Number with 2 digits.
  • 思路:
    简单了查阅了网上的水仙花题目,因为并不想直接看题目答案,所以自己整理了一下敲码思路,首先输入的不是一个固定的数,而是输入一个位数,这个位数代表的数字都得进行判断看是不是水仙花数,然后在纸上推敲了一下,得出如果输入的是6,那么我实际在程序中用到的六位数是100000----999999,输入7,用到的1000000-----9999999,我们可以发现如果我们输入一个N,那么我们在程序中用到的是10^(N-1) ~ 10^N -1,这里推理的公式,有些相像,第一个是10的N-1次方,而第二个式子却是10的N次方后再减去1.
    这样,我们已经确定了要用到的数字,只需要对其做判断就可以输出结果了.

    下面贴出源代码

import java.util.Arrays;

public class ShuixianHua {
    public static void main(String[] args) {
       int [] as = sxh(3);
        System.out.println(Arrays.toString(as));
    }

    public static int[] sxh(int n) {
        int sum ;int g = 0;
        int [] Output = new int[11] ;
        char shuwei[] = new char[8];
        int jieshou[] = new int[8];
        int chengfang[] = new int[8];
        int min = (int) Math.pow(10, n - 1);                //N位数的最小值
        int max = (int) Math.pow(10, n);                    //N位数的最大值
        if (min == 1) {                                     //N为1时,N的最小值不是1.而是0
            min = 0;
        }
        for (int i = min; i < max; i++) {                   //遍历N位数的所有值
            sum = 0;                                         //记得一定要在这里初始化
            String d = Integer.toString(i);                 //转String取每一位的数
            for (int j = 0; j < d.length(); j++) {
                shuwei[j] = (d.charAt(j));
                jieshou[j] = Integer.parseInt(String.valueOf(shuwei[j]));   //转
                chengfang[j] = (int) Math.pow(jieshou[j], n);    //逐位乘方
                sum += chengfang[j];                            //计算N位乘方和
                if (sum == i && j==n-1) {                       //判断是不是与原数相等,记得一定要让4位乘方之和与原数作比较
                    Output [g]=sum;                             //把水仙花数存入数组
                    g++;
                }
            }
        }
        int Last [] =new int [g];
        for (int i = 0; i 

上述代码中
if (sum == i && j==n-1)
在这里纠结了很久,因为在循环中sum有可能不会在N位之和开始判断,所以一定要保证sum在第N位开始判断

	*因为有些个位为0的水仙花数在上述循环中
    * 例如370,第二次的循环他已经确定为水仙
    * 花数,第三次循环也判断为水仙花数,所以
    * 会输出两次

第一次完全手搓算法,可能还有很多可以优化的地方,大佬们可以指导下.也是第一次在csdn上发表算法解析,可能内容有点冗杂,之后会尽量简练,有兴趣的小伙伴可以一起交流哦!!!

你可能感兴趣的:(数据结构与算法)