2016-11-21 3 views
-1

Если перечислить все натуральные числа до 10, кратные 3 или 5, мы получаем 3, 5, 6, 9 и 10. Сумма этих кратных составляет 33.Сумма чисел, кратных 3 и 5 MATLAB

Напишите функцию с именем sum3and5muls, которая возвращает сумму всех уникальных кратных 3 или 5 до n, где n является положительным целым числом, и единственным входным аргументом функции.

Вот попытка, но это правильно не работает 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 

который потребляет всего несколько байт ОЗУ. Но это все еще очень глупо. Давайте ставим эти серые ячейки работать несколько сложнее:

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

Спасибо за помощь –

Смежные вопросы