美文网首页
LeetCode之水仙花数

LeetCode之水仙花数

作者: eeb7f8c13944 | 来源:发表于2018-11-03 14:28 被阅读0次

    1. 水仙花数

    以下是摘自 维基百科 中的释义:

    数论中,水仙花Narcissistic number[1][2],也被称为超完全数字不变数pluperfect digital invariant, PPDI[3]自恋自幂数阿姆斯壮阿姆斯特朗数Armstrong number[4] ,用来描述一个N位非负整数,其各位数字的N次方和等于该数本身。

    这里定义的N=3。

    2. 问题描述

    春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+3^3。 现在要求输出所有在m和n范围内的水仙花数。

    对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
    如果给定的范围内不存在水仙花数,则输出no;
    每个测试实例的输出占一行。

    输入:
    100 120
    300 380

    输出:
    no
    370 371

    3. 问题分析

    我的解决思路:先将给出的数字按照个位十位百位的顺序拆解,然后计算各数位三次方之和,再和原数进行比较比较。思路比较简单。

    代码实现

    package com.odd.number;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    /**
     * @author zhulongkun20@163.com
     * @since 2018/11/3 下午12:58
     */
    public class Solution {
        private static List<Integer> getNumbers(int start, int end) {
            List<Integer> comps = new ArrayList<>();
            List<Integer> result = new ArrayList<>();
            double num;
            for (int i = start; i <= end; i++) {
                num = 0;
                comps.clear();
                comps = getNumberComponent(i);
                for (Integer comp : comps) {
                    num += Math.pow(comp, 3);
                }
                if (num == i) {
                    result.add(i);
                }
            }
            return result;
        }
    
        private static List<Integer> getNumberComponent(int number) {
            int base = 10;
            int comp;
            int lastComp;
            List<Integer> components = new ArrayList<>();
            while (number % (base / 10) != number) {
                int power = 0;
                lastComp = 0;
                for (Integer index : components) {
                    lastComp += index * Math.pow(10, power);
                    power += 1;
                }
                comp = ((number - lastComp) % base) / (base / 10);
                components.add(comp);
                base *= 10;
            }
            return components;
        }
    
        public static void main(String[] args) {
            List<Integer> result;
            Scanner input = new Scanner(System.in);
            while (input.hasNextLine()) {
                String str = input.nextLine();
                String[] numbers = str.split(" ");
                for (int i = 0; i < numbers.length - 1; i++) {
                    int start = Integer.valueOf(numbers[i]);
                    int end = Integer.valueOf(numbers[i + 1]);
                    result = getNumbers(start, end);
                    if (result.isEmpty()) {
                        System.out.println("no");
                    } else {
                        for (Integer aResult : result) {
                            System.out.print(aResult + " ");
                        }
                        System.out.println();
                    }
                }
            }
        }
    }
    

    他山之石

    貌似在评论区里看到了有用python解决的:


    QQ20181103-142633@2x.png

    没太看懂。

    相关文章

      网友评论

          本文标题:LeetCode之水仙花数

          本文链接:https://www.haomeiwen.com/subject/lmukxqtx.html