目录

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)相关推荐

  1. 花朵数c语言算法,21位花朵数(详解)

    今天看到了,蓝桥杯上面的一道题,求21位花朵数,题目是: l  (编程题)花朵数 一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数. 例如: 当N=3时,153 ...

  2. 算法笔记_010:插入排序(Java)

    1 问题描述 给定一组数据,使用插入排序得到这组数据的非降序排列. 2 解决方案 2.1 插入排序原理简介 引用自百度百科: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求 ...

  3. java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)

    1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即可.例如,如果输入数组[1,2,4,5,7,11,15]和 ...

  4. 金蝉素数c语言,算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)

    前言:以下代码仅供参考,若有错误欢迎指正哦~ 1好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学.习".但 ...

  5. java 蓝桥杯算法训练 寂寞的数(题解)

    试题 算法训练 寂寞的数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 道德经曰:一生二,二生三,三生万物. 对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和. ...

  6. Java实现 蓝桥杯 算法训练 K好数

    算法训练 K好数 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K ...

  7. java 完全背包问题算法_算法笔记(c++)--完全背包问题

    算法笔记(c++)--完全背包和多重背包问题 完全背包 完全背包不同于01背包-完全背包里面的东西数量无限 假设现在有5种物品重量为5,4,3,2,1 价值为1,2,3,4,5 背包容量为10 #in ...

  8. 明翰数据结构与算法笔记V0.8(持续更新)

    文章目录 前言 数据结构 `线性表` `数组` `链表` `栈与队列` [串/字符串] 树 并查集 `二叉树` [二叉排序树/二叉搜索树] `红黑树` 红黑树操作 霍夫曼树 `堆` [大/小]根堆 可 ...

  9. 【算法笔记】极客时间 算法面试通关40讲 笔记  覃超

    [算法笔记]极客时间 算法面试通关40讲 覃超 [算法笔记]极客时间 算法面试通关40讲 覃超 相关链接 在leetcode 上的题号 数组.链表: (堆)栈stack.队列queue 优先队列 哈希 ...

最新文章

  1. OpenCV alpha(权因子) 融合举例
  2. apt-mirror 校验错误文件处理
  3. 【转】日服巫术online过驱动保护分析(纯工具)(工具+自写驱动)
  4. matlab feval 函数说明,Matlab feval函数
  5. Java中String类型的概述
  6. 软件项目组织与管理期末考试复习要点整理翻译
  7. 微信扫描二维码后无法打开网页
  8. 禁止AutoCAD联网
  9. 编译工具 Ninja 介绍
  10. 平安金融科技移动技术周报(第二期)
  11. 最全数学各个分支简介
  12. mysql编码修改utf8_修改数据库mysql字符编码为UTF8
  13. Fibonacci扩展(奶牛问题)
  14. 阿里云mysql主从有延迟怎么办_MySQL主从数据库同步延迟问题解决
  15. 小叙酷狗和酷我音乐盒
  16. PPT的使用技巧(一):对齐、文字填充、柱状图填充
  17. ASP.net创建Controller视图时报错(Exception has been thrown by the target of an Invocation.)
  18. 人事管理系统多用于哪方面的工作?
  19. While.....Wend和Do While....Loop
  20. Ipv6的三种表示方法

热门文章

  1. Python-EEG工具库MNE中文教程(8)-参考电极简介
  2. B站焊武帝爆火出圈:纯手工拼晶体管自制CPU,耗时半年,可跑程序
  3. Homebrew正式支持苹果M1,程序员换新Mac又多了一条理由
  4. 吴恩达新年公开推荐这个设计师,上千人点赞
  5. 嬴彻科技拿下SemanticKITTI榜单两项第一
  6. 特斯拉的三季度:车卖很多、车主很烦、股价很魔幻
  7. 通用数据级别权限的框架设计与实现(3)-数据列表的权限过滤
  8. MyBatis 插入数据库返回主键
  9. 【Lv1-Lesson002】He and She
  10. java-Java可以对方法进行序列化?