循环

13 篇文章 0 订阅
9 篇文章 0 订阅

循环,即重复执行命令。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;
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值