/*
Sn = n*(n+1)/2
把两个相同的自然数列逆序相加
2Sn=1+n + 2+(n-1) + 3+(n-2) + ... n+1
=n+1 +n+1 + ... +n+1
=n*(n+1)
Sn=n*(n+1)/2
另,
m到n的自然数之和:Smn=(n-m+1)/2*(m+n)
(n>m)
Smn=Sn-S(m-1)
=n*(n+1)/2 -(m-1)*(m-1+1)/2
={n*(n+1) - m(m-1)}/2
={n*(n+1) - mn + m(1-m) + mn }/2
={n*(n-m+1)+ m(1+ n-m)}/2
=(n+m)(n-m+1)/2
注意:虽然题目说sum不会大于32位,但是n*(n+1)会大于32位。
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
long long n;
//freopen("F:\\input.txt", "r", stdin);
while (scanf("%lld", &n) != EOF)
{
printf("%lld\n\n", n * (n + 1) / 2);
}
//freopen("CON", "r", stdin);
//system("pause");
return 0;
}
HDU1001:Sum Problem
最新推荐文章于 2019-12-18 02:50:21 发布