如果我们列出10
或3
倍数的所有自然数,我们会得到5
,3
,{{1 },5
和6
。这些倍数的总和为9
。
编写一个名为10
的函数,它返回所有的总和
33
或sum3and5muls
到3
的唯一倍数,其中5
是一个正整数,也是函数的唯一输入参数。
这是尝试,但它对n
或更大的
n
答案 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