正しく機能していません。それについて考えてみましょう: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
あなたは文字通りあなたの宿題を貼り付けましたか? –
それは正しく動作していないとどのように判断していますか? (それは) – excaza
は「正しくない」と定義しています。あなたは予想された出力と実際の出力を分けられますか? –