问题描述
求1+2+3+…+n的值
输入格式:
输入包括一个整数n
输出格式:
输出一行,包括一个整数,表示1+2+3+…+n的值
数据规模与约定:
1<=n<=1,000,000,000
-
样例输入:
4
-
样例输出:
10
-
样例输入:
100
-
样例输出:
5050
解法1:循环累加
\\main.cpp
#include<iostream>
using namespace std;
int main(){
long long int S=0,n;
cin>>n;
for(;n>0;n--)
S+=n;
cout<<S;
return 0;
}
总结:运算时间长,资源占用高。n的值越大,意味着循环将执行更多次,需要消耗的时间越长
解法2:等差数列求和公式
公式:Sn=[n*(a1+an)]/2
\\main.cpp
#include<iostream>
using namespace std;
int main(){
long long int n;
cin>>n;
cout<<n*(1+n)/2;
return 0;
}
总结:算法优、运算时间短、资源占用低
题后总结:
- 当我看到题目的时候,我先想到的是循环累加。但是,题目给出的数据规模却很大。假如按数据规模最大值1,000,000,000来计算的话,程序将会在for语句这里执行1,000,000,000次,这意味着要消耗更多的时间来计算结果。
- 于是我开始寻找其它方法。我试图输入不同n的值来寻找n与1+2+…+n的规律。但最终失败了。
- 挣扎许久,终是没顶住度娘的诱惑。
- 得知解题方法后,向来对数学不感冒的我,似乎有了一丝丝兴趣。
- 通过这道题,我对编程也有了新的认识。我们不应该只带着传统的思维去解决问题,也不应该只关注程序运行的结果。我们关注程序运行结果的同时,也要关注它的过程。