2016-11-21 18 views
-1

我々は3または5の倍数である10までの全ての自然数を一覧表示する場合は、我々が得る356910。これらの倍数の合計は33です。 和と5 MATLAB

nは正の整数と機能の唯一の入力引数です n、最大 3または 5の全て 独特の倍数の和を返す sum3and5mulsという関数を書きます。ここで

は試みであるが、解決策が...かなりひどくスケールことn=1000または大きな

function total_mults = sum3and5muls(n) 

    N3 = 0:3:n; 
    N5 = 0:5:n; 
    N15 = 0:15:n; 

    v = N3(:) 
    w = N5(:) 
    x = sum(N15(:)); 

    sum_mults3 = sum(v); 
    sum_mults5 = sum(w); 

    total_mults = sum_mults3 + sum_mults5 - x; 

end 
+5

あなたは文字通りあなたの宿題を貼り付けましたか? –

+0

それは正しく動作していないとどのように判断していますか? (それは) – excaza

+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 
+0

ご協力ありがとうございます –