HackerRank中有一道算法题,

即有一个数(input),可以由一个序列[1 2 3 4 …..]的power(幂)的级别(power的值为2时,即平方,为3即立方,…..)相加得到。请问有多少种可能?

具体地说:

当:input =10 ;power =2;
有 10 =1^2 +3^2; 有一种构建方式。
当:input =100;power =2;
有100=10^2
= 6^2+8^2
=1^2+3^2+5^2+7^2 ;共三种构建方式。

也就是当input(<=1000)、power(>=2)确定时,有多少种组合?

一、构建一个系数矩阵(0,1)
在选的序列中,比如当power=2,序列[1,4,9,16,25,36,49,64,81,100]的序数是关键,本来是可以一个个试算的,但是放在一个矩阵中,会更方便。

下面的任务是构建一个穷尽的(0,1)矩阵,列有max_power_n项,即input开power根得到的值(input=100, power=2,max_power_n =sqrt(100)=10)。

思路是从mat =[1 0;1 1; 0 1; 0 0 ]来不断构建一个能包括各种情况的(0,1)矩阵,

其中:列数是:max_power_n。行数呢?
行数:是 2^(max_power_n) 。因为,每一列相当于一个变量,其值只有2种可能,0或1,也就会,所有的可能就是这个了。

function get_matrix(n::Int64)data =[];if n<2error("n<1!");elsemat =[1 0;1 1; 0 1; 0 0 ];for i=2:n-1temp1 =hcat(mat,zeros(mat)[:,1]);temp2= hcat(mat,ones(mat)[:,1]);data =[temp1;temp2];mat =copy(data);endreturn dataendend

二、输出函数

以下的函数可以得到总体的结果:

function get_result(input,power)max_power_n =Int64(ceil(input^(1/power)));out_matrix =get_matrix(max_power_n);sum_matrix =out_matrix*(collect(1:max_power_n).^power);output =sum(sum_matrix.==input);println("input:$input power:$power =>result :$output");return output;
end

output:

julia> get_result(100,2)
input:100 power:2 =>result :3
3julia> get_result(10,2)
input:10 power:2 =>result :1
1julia> get_result(10,3)
input:10 power:3 =>result :0
0julia> get_result(100,4)
input:100 power:4 =>result :0
0julia> get_result(120,2)
input:120 power:2 =>result :4

但是,如何看到明细的构成组合呢?

三、如何输出明细的结果?

既然要输出明细,那就让我们做一些优化:

function get_result_detail(input,power)max_power_n =Int64(ceil(input^(1/power)));out_matrix =get_matrix(max_power_n);series =collect(1:max_power_n).^power;sum_matrix =out_matrix*series;vec =sum_matrix.==input;println_detail(out_matrix,series,vec,input,power);
end

让我们写一个输出明细结果的函数:

function println_detail(out_matrix,series,vec,input,power)row,col=size(out_matrix)n =0;for i =1:rowif vec[i]==trueis_print_row =false;n =n+1;for j=1:colmat = out_matrix[i,j];ser = series[j];is_print_row ==false && print("$n th: =>");is_print_row =true;if mat==1 print(" $ser ");endendprint("\n");endendprintln("input:$input power:$power => total result :$n");
end

四、优化的结果输出

output_detail =>

julia> get_result_detail(100,2)
1 th: => 1  9  16  25  49
2 th: => 36  64
3 th: => 100
input:100 power:2 => total result :3julia> get_result_detail(102,2)
1 th: => 1  16  36  49
2 th: => 4  9  25  64
3 th: => 1  4  16  81
input:102 power:2 => total result :3julia> get_result_detail(225,2)
1 th: => 9  16  36  64  100
2 th: => 25  36  64  100
3 th: => 1  4  9  16  25  49  121
4 th: => 4  36  64  121
5 th: => 4  100  121
6 th: => 4  16  25  36  144
7 th: => 1  16  64  144
8 th: => 81  144
9 th: => 4  16  36  169
10 th: => 4  9  16  196
11 th: => 4  25  196
12 th: => 225
input:225 power:2 => total result :12

这下明细也可以看清楚了。

有一个问题,为什么power不能为1?我认为如果power为1,若input较大,你想象一下,这个矩阵得多大,会导致直接内存溢出。

Julia : The Power Sum的算法相关推荐

  1. HDU 7105 Power Sum

    Problem Description Given a positive number n, Kris needs to find a positive number k and an array { ...

  2. [Julia语言]使用Chudnovsky 算法快速计算圆周率 Pi (π) 值

    测试用的电脑是一台10年老电脑,CPU型号:E3 1230V2,3.3GHZ,4核8线程,8GB内存. 用下面的Julia程序,计算1万位的Pi值,耗时为0.26秒. 作为比较,用Julia实现的另一 ...

  3. python 数组合并排重_并排深度学习:Julia vs Python

    python 数组合并排重 Julia could possibly be the biggest threat to Python. For a variety of applications, J ...

  4. Java身份证校验算法

    实现是先校验位数然后再校验身份证号码每个数字代表的作用是否正确(就是工具类中介绍的)校验成功还需要校验1-17位相乘因子数组的一个算法保证输入的身份证是最准确的 /*** 验证身份证号是否符合规则** ...

  5. 数据结构与算法(1)高斯算法

    高斯算法(累加求和) 普通算法累加求和需要for()循环遍历求和,但高斯算法可以通过一个算式直接求得,大大节省时间效率 #include <iostream> #include <c ...

  6. prim算法构建最小生成树

    问题[描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)] 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即),而 w(u, v) ...

  7. lingo 嵌套@for或嵌套@sum

    嵌套@for或嵌套@sum 对集合中的i单独求和,例如集合Xij,求Xi1+Xi2+Xi3-+Xin sets: r/1..5:y; c/1..5/:; link(r,c):x; endsets @f ...

  8. 简单分析算法的时间复杂度

    目录 一.什么是算法的时间复杂度 二.如何分析一个算法的时间复杂度 1.有确定次数的算法 2.次数不确定的算法 一.什么是算法的时间复杂度         时间复杂度是一个函数 ,定性描述一个算法(程 ...

  9. 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)

    带权图分为有向和无向,无向图的最短路径又叫做最小生成树,有prime算法和kruskal算法:有向图的最短路径算法有dijkstra算法和floyd算法. 生成树的概念:联通图G的一个子图如果是一棵包 ...

  10. 算法—2,记一个自己的算法题 计算数字k在0到n中的出现的次数,k可能是0~9的一个值

    3 计算数字k在0到n中的出现的次数,k可能是0~9的一个值 例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现1出现了5次 (1 ...

最新文章

  1. html 资源缓存,解决index.html缓存问题
  2. new Integer 和 Integer.valueOf 有什么不同
  3. 回溯法——打印子集树
  4. SQLServer数据库原理读书笔记(三)--表的物理存储
  5. VUE页面实现加载外部HTML方法
  6. Nginx——安装与虚拟主机配置(域名非80端口问题)
  7. ffmpeg命令解析
  8. atitit.Windows Server 2003 2008 2012系统的新特性 attilax 总结
  9. 小游戏流量变现瓶颈,新增长点是超级App?
  10. [洛谷1849] 拖拉机
  11. 汇编综合实验--学生管理系统
  12. 商品筛选html,js实现简单商品筛选功能
  13. Java函数的基本知识
  14. Python之kafka消息队列操作入门
  15. 浅谈FromHandle
  16. 华为网络配置(BGP)
  17. 周日下雨,寂寥中读核
  18. 机器学习BP算法及矩阵求导
  19. 科学计算机怎么玩游戏,游戏做生命科学研究:玩家强过超级计算机
  20. PEP 8 -- Style Guide for Python Code。Python 代码规范。

热门文章

  1. No_16_0225 Java基础学习第六天
  2. 能够做到这10点,成功将离你不远
  3. 数据库DB2性能优化高级进阶
  4. 微软软件基地落户广州
  5. 你要好好的---歌词
  6. Framework4.5,vs下系统自动生成的C++ win32应用程序的详细解释
  7. Redis 锁的实现方案
  8. IDEA里面添加lombok插件,编写简略风格Java代码(转)
  9. linux环境下tomcat启动成功,部分请求页面出现404
  10. 190530每日一句