循环,即重复执行命令。c++中常见的循环有三种:for循环、while循环和do-while循环。基本的结构如下:
for循环:
for(变量;条件;命令){
语句;
}
while循环:
while(条件){
语句;
}
do-while循环:
do{
语句;
}while(条件);
下面给出一个例子:
int sum = 0;
for(int i = 1; i <= 100; i++){
sum += i;
}
int sum = 0;
int i = 1;
while(i <= 100){
sum += i;
i++;
}
int sum = 0;
int i = 1;
do{
sum += i;
i++;
}while(i <= 100);
这三段循环得到的sum的值都为5050,即1+2+3+...+100的值。
下面是一些我刷的习题:
n个数的极差
Description
极差,是指一组数据中,最大值与最小值之差。
小信现在列出了 n 个数字,需要你帮他找出这一组数字的极差,编写程序帮帮他吧。
Input
第一行输入一个正整数 n(1≤n≤10000),代表这组数字中有 n 个数。第二行输入 n 个以空格分隔的正整数(均在int 的数据范围内)。
Output
输出一个数字,为输入数据中 n 个数字的极差。
这题需要定义两个变量分别储存最大值和最小值:
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
int num[n];
for (int i = 0; i < n; i++) cin >> num[i];
int maxn = -52697, mini = 52697;//maxn为一个非常小的值,min为一个非常大的值
for (int i = 0; i < n; i++){
if (num[i] > maxn) maxn = num [i];
if (num[i] < mini) mini = num [i];
}
int ans;
ans = maxn - mini;//计算极差
cout << ans << endl;
return 0;
}
n阶递减三角形
Description
给定一个整数 n。输出一个 n 行数字,n 行数字中的第 i 行包含 n−i+1 个由空格隔开的整数,其中第一个数为 n−i+1,之后每一个数都比前一个小 1(1≤i≤n)。
Input
你的程序将会接受一个整数,表示 n(0<n≤30)。
Output
输出一个 n 行数字
n 行数字中的第 i 行包含 n−i+1 个由空格隔开的整数(1≤i≤n)
每行第一个数为 n−i+1,之后每一个数都比前一个小 1(1≤i≤n)
这里需要使用循环嵌套,即循环里面套循环:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
for(int i = n; i >= 1; i--){
for(int j = i; j >= 1; j--){
if(j != i) cout << " ";//控制行末没有多余空格
cout << j;
}
cout << endl;
}
return 0;
}
数列计算I
Description
现在有一个这样的数列,观察这组数列的规律:
3, 5, 9, 15, 23, 33, 45...
小信会给你一个数字 n,你需要编写程序输出数列的前 n 项以及它们的和。
Input
输入有一行,包含一个整数 n(3≤n≤300)为这个序列的项数。
Output
输出有 n+1 行,前 n 行为你计算出的数列的前 n 项,最后一行只有一个整数, 为这个序列前 n 项的和。
通过观察我们不难发现,每下一个数加上的值都比上一次加的值多了2:
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
int s = 0, begi = 3;
for(int i = 1, j = 0; i <= n; i++, j += 2){//j为每次应该加上的值
begi += j;
cout << begi << endl;
s += begi;
}
cout << s << endl;
return 0;
}
数列计算II
Description
有一列数是:4/7,7/11,11/18,18/29,29/47,47/76……请找出这个数列的规律,编写程序计算并输出这个数列的第 N 项(要求是分数形式),并计算这个数列的前 N 项和(四舍五入到小数点后2位)。
Input
输入有一行,为一个正整数 N(3≤N≤30)。
Output
输出共有两行
第一行如样例中的一个特定格式的分数表示这个数列的第 N 项。
第二行仅包含一个数表示这个数列的前 N项的和。
通过观察可以发现,每个数的分子都是前两个数分母的和,而分母则为下一个数的分子:
#include<iostream>
using namespace std;
long long a = 4, b = 7, c = 11;
double ans = (double)4 / 7;
void vec(int);
int main(){
int n;
cin >> n;
vec(n - 1);
cout << a << "/" << b << endl << ans;
return 0;
}
void vec(int n){
if(n == 0) return;
a = b; c = c + b; b = c - b;//对分子分母进行累加
ans += (double)a / b;
vec(n - 1);//递归
}
输出字母沙漏
Description
我们的程序会接受一个整数输入 n,并输出一个沙漏形,这个沙漏形共有 2n+1 行,第一行有 2n+1 个字母,其中前 n+1 个字符是由字符 A 开始依次递增的,而后 n 个字符是由第 n+1 个字符开始 依次递减的。之后 nn 行依次会在上一行的基础上用空格替代头尾两个字母。再之后的 n 行则正好是前 n 行反过来输出的结果。
例如当 n = 3时输出:
ABCDCBA
BCDCB
CDC
D
CDC
BCDCB
ABCDCBA
Input
输入包括一行,为一个正整数 n(n<26)。
Output
输出包括 n 行,构成题目描述中的沙漏型。
这题需要我们将循环使用得十分准确:
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
char ch1 = 'A' - 1;
for(int i = 1; i <= n + 1; i++){
for(int j = 1; j <= i - 1; j++) cout << " ";
for(int j = i; j <= n + 1; j++){
ch1++;
cout << ch1;
}
for(int j = 1; j <= n + 1 - i; j++){
ch1--;
cout << ch1;
}
cout << endl;
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n - i; j++) cout << " ";
for(char ch2 = ch1 - i; ch2 <= ch1; ch2++){
cout << ch2;
}
for(char ch2 = ch1 - 1; ch2 >= ch1 - i; ch2--){
cout << ch2;
}
cout << endl;
}
}