3和5 MATLAB的倍数之和

时间:2016-11-21 13:34:23

标签: matlab

如果我们列出103倍数的所有自然数,我们会得到53,{{1 },56。这些倍数的总和为9

编写一个名为10的函数,它返回所有的总和 33sum3and5muls3的唯一倍数,其中5是一个正整数,也是函数的唯一输入参数。

这是尝试,但它对n或更大的

无效
n

1 个答案:

答案 0 :(得分:1)

那个解决方案......非常糟糕。想一想:如果你想为N = 4294967295计算一下,你需要多少内存?

<0:3:N>  = 1431655765 elements
<0:5:N>  = 858993459 elements
<0:15:N> = 286331153 elements
------------------------------- + 
2576980377 elements 
64-bit double precision 
------------------------------- × 
19.2 GB

这有点傻。让我们以不同的方式思考:

function total_mults = sum3and5muls(n)

    assert(isinteger(n),...
           [mfilename ':datatype_error'],...
           'Input ''n'' expected to be integer.');

    total_mults = 0;
    for m = 1:n
        if mod(m,3)==0 || mod(m,5)==0;
            total_mults = total_mults + m; end
    end

end

只消耗少量的RAM字节。但是,这仍然有点傻。让我们让那些灰色的细胞更加努力地工作:

function total_mults = sum3and5muls(n)

    S = @(m) m*(m+1)/2;  
    total_mults = 3*S(floor(n/3)) + 5*S(floor(n/5)) - 15*S(floor(n/15));

end

开始看起来很专业。但是,让我们不要止步于此,并假装我们真正了解性能方面,数字假象如溢出等:

function total_mults = sum3and5muls(n)

    fn3  = floor(n./3);
    fn5  = floor(n./5);
    fn15 = floor(fn5./3);

    fo3 = 1./fn3;
    fo5 = 1./fn5;

    total_mults0 = round(0.5 * fn3 * fn5 * ( ...
                 3*fn3*fo5      +  3*fo5      + ...
                 5*fn5*fo3      +  5*fo3      - ...
        fn15 * (15*fn15*fo3*fo5 + 15*fo3*fo5)   ...
        ))

end