算法笔记_218:花朵数(Java)
目录
1 问题描述
2 解决方案
1 问题描述
一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。
例如:
当N=3时,153就满足条件,因为 1^3 + 5^3 + 3^3 = 153,这样的数字也被称为水仙花数(其中,“^”表示乘方,5^3表示5的3次方,也就是立方)。
当N=4时,1634满足条件,因为 1^4 + 6^4 + 3^4 + 4^4 = 1634。
当N=5时,92727满足条件。
实际上,对N的每个取值,可能有多个数字满足条件。
程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。
如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。
2 解决方案
以下代码实际测试要接近3分钟才能出结果,代码仅供参考~
1 import java.math.BigInteger; 2 import java.util.ArrayList; 3 import java.util.Collections; 4 5 public class Main { 6 public static ArrayList<BigInteger> set = new ArrayList<BigInteger>(); 7 public static BigInteger[] value = new BigInteger[10]; 8 public static int count = 0; 9 10 public BigInteger getPow(BigInteger n) { 11 BigInteger result = BigInteger.ONE; 12 for(int i = 1;i <= 21;i++) 13 result = result.multiply(n); 14 return result; 15 } 16 17 public boolean check(int[] A) { 18 BigInteger temp = BigInteger.ZERO; 19 for(int i = 0;i < 10;i++) { 20 BigInteger k = new BigInteger(""+A[i]); 21 temp = temp.add(value[i].multiply(k)); 22 } 23 String s = "" + temp; 24 if(s.length() != 21) 25 return false; 26 int[] B = new int[10]; 27 for(int i = 0;i < 21;i++) { 28 int k = s.charAt(i) - '0'; 29 B[k]++; 30 } 31 for(int i = 0;i < 10;i++) 32 if(A[i] != B[i]) 33 return false; 34 return true; 35 } 36 37 public void dfs(int step, int sum, int[] A) { 38 if(step == 10) { 39 if(sum == 21 && check(A)) { 40 BigInteger temp = BigInteger.ZERO; 41 for(int i = 0;i < 10;i++) { 42 BigInteger k = new BigInteger(""+A[i]); 43 temp = temp.add(value[i].multiply(k)); 44 } 45 if(!set.contains(temp)) 46 set.add(temp); 47 count++; 48 } 49 return; 50 } else { 51 for(int i = 0;i <= 21 - sum;i++) { 52 A[step] = i; 53 dfs(step + 1, sum + i, A); 54 } 55 } 56 } 57 58 public static void main(String[] args) { 59 Main test = new Main(); 60 for(int i = 0;i <= 9;i++) { 61 BigInteger a = new BigInteger(""+i); 62 value[i] = test.getPow(a); 63 } 64 int[] A = new int[10]; 65 test.dfs(0, 0, A); 66 Collections.sort(set); 67 for(int i = 0;i < set.size();i++) 68 System.out.println(set.get(i)); 69 } 70 }
运行结果:
128468643043731391252 449177399146038697307
算法笔记_218:花朵数(Java)相关推荐
- 花朵数c语言算法,21位花朵数(详解)
今天看到了,蓝桥杯上面的一道题,求21位花朵数,题目是: l (编程题)花朵数 一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数. 例如: 当N=3时,153 ...
- 算法笔记_010:插入排序(Java)
1 问题描述 给定一组数据,使用插入排序得到这组数据的非降序排列. 2 解决方案 2.1 插入排序原理简介 引用自百度百科: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求 ...
- java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)
1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即可.例如,如果输入数组[1,2,4,5,7,11,15]和 ...
- 金蝉素数c语言,算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)
前言:以下代码仅供参考,若有错误欢迎指正哦~ 1好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学.习".但 ...
- java 蓝桥杯算法训练 寂寞的数(题解)
试题 算法训练 寂寞的数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 道德经曰:一生二,二生三,三生万物. 对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和. ...
- Java实现 蓝桥杯 算法训练 K好数
算法训练 K好数 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K ...
- java 完全背包问题算法_算法笔记(c++)--完全背包问题
算法笔记(c++)--完全背包和多重背包问题 完全背包 完全背包不同于01背包-完全背包里面的东西数量无限 假设现在有5种物品重量为5,4,3,2,1 价值为1,2,3,4,5 背包容量为10 #in ...
- 明翰数据结构与算法笔记V0.8(持续更新)
文章目录 前言 数据结构 `线性表` `数组` `链表` `栈与队列` [串/字符串] 树 并查集 `二叉树` [二叉排序树/二叉搜索树] `红黑树` 红黑树操作 霍夫曼树 `堆` [大/小]根堆 可 ...
- 【算法笔记】极客时间 算法面试通关40讲 笔记 覃超
[算法笔记]极客时间 算法面试通关40讲 覃超 [算法笔记]极客时间 算法面试通关40讲 覃超 相关链接 在leetcode 上的题号 数组.链表: (堆)栈stack.队列queue 优先队列 哈希 ...
最新文章
- OpenCV alpha(权因子) 融合举例
- apt-mirror 校验错误文件处理
- 【转】日服巫术online过驱动保护分析(纯工具)(工具+自写驱动)
- matlab feval 函数说明,Matlab feval函数
- Java中String类型的概述
- 软件项目组织与管理期末考试复习要点整理翻译
- 微信扫描二维码后无法打开网页
- 禁止AutoCAD联网
- 编译工具 Ninja 介绍
- 平安金融科技移动技术周报(第二期)
- 最全数学各个分支简介
- mysql编码修改utf8_修改数据库mysql字符编码为UTF8
- Fibonacci扩展(奶牛问题)
- 阿里云mysql主从有延迟怎么办_MySQL主从数据库同步延迟问题解决
- 小叙酷狗和酷我音乐盒
- PPT的使用技巧(一):对齐、文字填充、柱状图填充
- ASP.net创建Controller视图时报错(Exception has been thrown by the target of an Invocation.)
- 人事管理系统多用于哪方面的工作?
- While.....Wend和Do While....Loop
- Ipv6的三种表示方法