C++程序基础(16):C++for循环语句例题

时间:2025-03-25 16:39:39

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 i1 个输出的值加上 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

完结撒花~