C++for循环语句例题
- 前言
- 例题:求和
- 做法1:
- 代码实现:
- 做法2:
- 代码实现
前言
for循环语句是C++中常用的语句结构
我们可以用这种结构解决各种各样的问题
那么今天我们将介绍一道for循环语句的例题
例题:求和
题目描述:
输入一个整数 n n n ,每行输出一个数,表示数字 1 1 1 到 i i i 的和。
比如,当 n = 5 n=5 n=5 时,
第 1 1 1 行输出一个数字 1 1 1
第
2
2
2 行输出数字
3
3
3 ,因为1+2=3
第
3
3
3 行输出数字
6
6
6,因为1+2+3=6
第
4
4
4 行输出数字
10
10
10 ,因为1+2+3+4=10
第
5
5
5 行输出数字
15
15
15 ,因为1+2+3+4+5=15
输入格式:
输入一行一个整数 n n n
输出格式:
输出共 n n n 行,每行一个整数
第 i i i 行输出的数,表示数字 1 1 1 到 i i i 的和
输入样例:
6
- 1
输出样例:
1
3
6
10
15
21
- 1
- 2
- 3
- 4
- 5
- 6
数据范围:
1 < = n < = 1 0 7 1<=n<=10^7 1<=n<=107
做法1:
本题的题意就是第 i i i 个输出为从 1 1 1 到 i i i 的累加
那么我们首先想到的思路肯定是对于第 i i i 个输出进行从 1 1 1 到 i i i 的循环进行累加
但是这种算法的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
而我们看到数据范围:
1 < = n < = 1 0 7 1<=n<=10^7 1<=n<=107
显然这种算法不能解决
那么我们思考一下
因为题目的输出也是从 1 1 1 到 i i i 进行输出
那么我们可以发现,第 i i i 个输出可以转化为第 i − 1 i-1 i−1 个输出的值加上 i i i
这样,我们只要从头输出到尾就可以实现了
时间复杂度为 O ( n ) O(n) O(n)
符合要求
但是我们发现,程序输出的最大值大概在1014以内,而int类型变量的最大值为231-1,也就是 2147283647 2147283647 2147283647,很明显会爆int,所以要使用long long类型存储
代码实现:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
long long k=0;//记得使用long long
for(int i=1;i<=n;i++)
{
k+=i;//累加
printf("%lld\n",k);//为了防止时间超限,这里使用printf
}
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
做法2:
分析一下第 i i i 个输出,发现是从 1 1 1 加到 i i i 的累加
我们小学时学过一个公式
用来解决等差数列求和的
也就是(首项+末项)*项数/2
那么对于第 i i i 个输出而言,首项是 1 1 1 ,末项就是 i i i ,项数也是 i i i
那么第 i i i 个输出的求和公式便为:
(1+i)*i/2
这样也可以解决这类问题
同样也要注意long long!
代码实现
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int k=(1+i)*i/2;//等差数列求和公式
printf("%lld\n",k);
}
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14