首页 > 解决方案 > 找出所有等于其数字的阶乘之和的数字

问题描述

如何通过 MATLAB 找到等于其数字阶乘之和的所有数字(例如 145= 1!+ 4!+ 5!= 1 + 24 + 120 = 145。)?

我想砍掉数字,将数字的阶乘加在一起并将其与原始数字进行比较。如果阶乘总和等于原始数字,则该数字在解中,必须保留。我无法编码我的想法,我该如何编码?这是真的?谢谢

标签: matlab

解决方案


我发布这个答案的主要原因是我不能在没有像样的替代方案的情况下离开eval上一个答案中的使用

这是一个小函数来检查任何给定的(整数)n

isFact = @(n) n==sum(factorial(int2str(n)-'0'));

解释:

  1. int2str(n)-'0':“砍掉数字”
  2. sum(factorial(...)):“将数字的阶乘加在一起”
  3. 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))

推荐阅读