Как посчитать сумму чисел на промежутке от a до b, без цикла?
Столкнулся с этой задачей еще давно и так и не дает покоя. Понятно, что циклом решить это затратно по времени, но я нашел и другой выход – арифметическая прогрессия, но тут начало не с 1, а с произвольного элемента, так что тут стандартной формулой не получится.
Конкретизирую вопрос:
Как математически посчитать сумму например от 47 до 72, т.е. 47 + 48+ 49 … + 72 ?
sum = (1+b)*b/2;
sum2 = (1+a)*a/2;
result =sum - sum2;
Почти правильно... У меня тоже было такое решение, но при малых a, формула делает ошибку и при стандартных 1 до 100 выдает 1049(должен 1050), при 2 до 5 выдает 12(должно 14).
Если к результату прибавлять a то уже при 5 до 10 будет неверный ответ 60 (должно быть 55).
Можно условия навешать, но может есть более элегантная формула?
Во-первых, есть комментарии к ответу. Во-вторых, ничего не путаете?
Нужно вместо a использовать (a-1):
от 1 до 100: (1+100)*100/2 - (1+0)*0/2 = 5050
от 2 до 5: (1+5)*5/2 - (1+2)*2/2 = 12
от 5 до 10: (1+10)*10/2 - (1+4)*4/2 = 45 (Откуда у вас 55 и 60 - непонятно)
a + (a + 1) + ... + b = (b - a + 1) * (b + a) / 2
я вспоминаю эту формулу так:
a + (a + 1) + ... + (b - 1) + b =
= a + 0 + a + 1 + a + 2 + ... + a + (b - a) =
= a * (b - a + 1) + (0 + 1 + 2 + .. + (b - a)) =
= a * (b - a + 1) + (b - a) * (b - a + 1) / 2 =
= (b + a) * (b - a + 1) / 2
Стандартной формулой тут получится.
S = (a1+an)*n/2, где a1 - первый член, an - последний, n - количество членов последовательности
Имеем (47+72)*26/2 = 1547
Я бы немного расширил ответ. Требуется вычислить сумму от a до b с шагом d
Эту сумму можно представить как n*a+0+1+...+(n-1)=n*a+(n-1)*(n-1+1)/2=n*a+n*(n-1)/2=n*(a+(n-1)/2) учитывая, что n=b-a+1, получаем (b-a+1)*(a+(b-a+1-1)/2)=(b-a+1)*(2a+b-a)/2=(b-a+1)*(a+b)/2
@Izhak если нужно более подробно, то как вы правильно дали ссылку, всё описанно в вики с доказательствами, а переписывать сюда википедию по-моему бессмысленно :)
result = ((b+1)*b-(a-1)*a) div 2;
a=1 b=100 result=5050 (именно столько и должно быть, а не 1050)
a=2 b=5 result=14 (2+3+4+5=14)
a=5 b=10 result=45 (5+6+7+8+9+10=45)