matlab - 找出所有等于其数字的阶乘之和的数字
问题描述
如何通过 MATLAB 找到等于其数字阶乘之和的所有数字(例如 145= 1!+ 4!+ 5!= 1 + 24 + 120 = 145。)?
我想砍掉数字,将数字的阶乘加在一起并将其与原始数字进行比较。如果阶乘总和等于原始数字,则该数字在解中,必须保留。我无法编码我的想法,我该如何编码?这是真的?谢谢
解决方案
我发布这个答案的主要原因是我不能在没有像样的替代方案的情况下离开eval
上一个答案中的使用
这是一个小函数来检查任何给定的(整数)n
:
isFact = @(n) n==sum(factorial(int2str(n)-'0'));
解释:
int2str(n)-'0'
:“砍掉数字”sum(factorial(...))
:“将数字的阶乘加在一起”n==...
: "与原数比较"
您现在可以将其插入循环以查找 1 到 之间的所有数字maxInt
:
maxInt = 100000; % just for the example
solution = false(1,maxInt); % preallocating memory
for k = 1:maxInt
solution(k) = isFact(k);
end
find(solution) % find all the TRUE indices
结果:
ans =
1 2 145 40585
上面的循环写得很简单。如果您寻求更高的效率和灵活性(例如不检查 1 到之间的所有数字maxInt
并检查任何形状的数组),您可以将其更改为:
% generating a set of random numbers with no repetitions:
Vec2Check = unique(randi(1000,1,1000)); % you can change that to any array
for k = 1:numel(Vec2Check)
if isFact(Vec2Check(k))
Vec2Check(k) = Vec2Check(k)+0.1;
end
end
solution = Vec2Check(Vec2Check>round(Vec2Check))-0.1
添加的 0.1 用作标记为它们isFact
返回的数字的“标志” true
。然后,我们通过将向量与其圆角版本进行比较来提取它们。
您甚至可以使用单线解决方案:
solution = nonzeros(arrayfun(@(n) n.*(n==sum(factorial(int2str(n)-'0'))),Vec2Check))
推荐阅读
- d3.js - 自定义 Apache 超集中的数字格式
- r - 为什么 knitr 会在其他工作正常的管道上窒息?
- node.js - NestJs 请求标头大小错误 Http 代码 431
- python - py2app 无法启动,系统控制台中没有重要日志
- javascript - 验证表单上的多个字段类型
- javascript - 从 javascript 数据集中删除一行并将其转移到另一个数据集中?
- javascript - 获取 React 组件名称的最佳方法是什么?
- node.js - 一个信号创建通知 REST API 有时会失败
- node.js - 如何正确地将读取流分叉为 3 个压缩流以进行基准计算?
- python-3.x - AWS boto3 - 资源:lakeformation 功能:batch_revoke_permissions - 代表 ALL_TABLES