1. 水仙花数
用来描述一个 N 位非负整数,其各位数字的 N 次方和等于该数本身。
这里定义的N=3。
2. 问题描述
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。 现在要求输出所有在m和n范围内的水仙花数。
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
输入:
100 120
300 380
输出:
no
370 371
3. 问题分析
我的解决思路:先将给出的数字按照个位十位百位的顺序拆解,然后计算各数位三次方之和,再和原数进行比较比较。思路比较简单。
4. 代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| package com.odd.number;
import java.util.ArrayList; import java.util.List; import java.util.Scanner;
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(); } } } } }
|
5. 他山之石
貌似在评论区里看到了有用python解决的:

没太看懂。