2015-05-24 3 views
-1

я работаю над следующей проблемой:Наименьшее целое число, большее или равное гармонический ряд входных

enter image description here

Я понимаю, что мой код откусил, но я хочу, чтобы создать цикл, который определит, будет ли целое число x (входное значение) не меньше или равно сумме гармонического ряда.

Вот то, что я до сих пор:

function n =one_per_n(x) 
if x > 10000 
    n = -1; 
end 
total = 0; 
i = 0; 
for i = 1:10000 
     if x >= total 
      n = ceil(total); 
     else 
      total = (1/i) + total; 


    end 


    end 

Я добавил свою попытку на время цикла. Я понимаю, что это неправильно, но любая помощь будет оценена по достоинству.

function n =one_per_n(x) 
if x > 10000 
    n = -1; 
end 
total = 0; 
i = 0; 
for i = 1:10000 
     while total <= x 
      total = (1/i) + total; 
    end 
    end 

n = total;

+0

Использование 'break' для выхода из цикла, как только вы обнаружили, 'n' (в операторе' if') – buzjwa

+0

Кроме того, нет необходимости увеличивать 'i' через' i = i + 1; '. Это уже сделано самим циклом 'for' – buzjwa

+0

Прочитайте это: [Записи управления контуром] (http://www.mathworks.com/help/matlab/matlab_prog/loop-control-statements.html) – buzjwa

ответ

0

Некоторое время цикла является лучшим вариантом в этом случае я думаю, что

function [total, n] = one_per_n(x) 
% This is a good initial check, good work 
if x > 10000 
    n = -1; 
    return; 
end 

% Initialize the variables 
total = 0; 
n = 0; 

% While not finished 
while (total < x) 
    % Number of terms 
    n = n + 1; 
    total = total + 1/n; 
end 

end 
+0

Спасибо, я собираюсь опубликовать обновленный код с циклом while. Это неправильно, но если кто-нибудь может указать на мою ошибку, я был бы признателен. – statsguyz

+1

Вы должны использовать 'return' после' if'. – Rashid

+1

Хорошо, я добавил. – user1543042

2

вам не нужно использовать несколько петель:

function n = one_per_n(x) 
lim = min(10000,exp(x)); 
value = cumsum(1./(1:lim)); 
n  = find(value >= x,1); 
if isempty(n) 
    n = -1; 
end 
+0

Ничего себе! Спасибо, это работает. Мне нужно это изучить! – statsguyz

+0

Хорошо, но на самом деле решение не так эффективно, учитывая вашу память. 'Lim' должен быть на' x', длина 'a' будет больше. Вы можете использовать 'value = cumsum (1 ./ (1: lim)),' – Rashid

+0

спасибо, это оптимизировано сейчас. exp (x)> n – obchardon

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