C++保姆级入门教程(10)—— 一维数组练习

哈喽大家好,我是iecne,本期为大家带来的是CPP/C++保姆级入门教程的第⑩期—— 一维数组基础 ,包教包会,快来看看吧!

此教程适合新手小白,因为语言会十分的通俗易懂,不会有很多的专业词汇出现,可以更好的掌握并且吸收,后续加上持之以恒的练习题目将会基本巩固


目录

一. 一维数组的意义

二.习题练习

1.小鱼比可爱

题目描述

参考答案

题目思路

2.小鱼的数字游戏

题目描述

参考答案

题目思路

3.冰雹猜想

题目描述

参考答案

题目思路

4.[NOIP2005 普及组]校门外的树

题目描述

参考答案

题目思路

 三.总结

 系列文章目录


一. 一维数组的意义

计算机运算速度很快,一秒钟可以处理成千上万的数据。之前的例子都是读取一个数据后立刻对这些数据进行处理,然后再也不需要用到这些数据了;有时候,我们读入数据后还需要将这些数据保存下来,便于以后再次使用。如果保存个别几个数据,可以设立几个变量存储;但是如果要存储成千上万个数据,总不能定义成千上万个变量吧。

既然可以通过循环语句来重复执行结构类似的语句,也有办法一次定义一组成千上万个的相同类型的变量——使用数组。这样就可以把大量的数据存储下来,随时使用了。数组不仅可以存储输入的数据,还能存下运算过程中的“半成品”甚至答案,是 C++ 中非常重要的一部分。


二.习题练习

1.小鱼比可爱

题目描述

人比人,气死人;鱼比鱼,难死鱼。小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度。参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只鱼的可爱程度,很显然整数越大,表示这只鱼越可爱,而且任意两只鱼的可爱程度**可能一样**。由于所有的鱼头都朝向左边,所以每只鱼只能看见在它左边的鱼的可爱程度,它们心里都在计算,在自己的眼力范围内有多少只鱼不如自己可爱呢。请你帮这些可爱但是鱼脑不够用的小鱼们计算一下。

输入格式

第一行输入一个正整数n,表示鱼的数目。

第二行内输入 n 个正整数,用空格间隔,依次表示从左到右每只小鱼的可爱程度ai。

输出格式

一行,输出 n 个整数,用空格间隔,依次表示每只小鱼眼中有多少只鱼不如自己可爱。

样例 1

样例输入 1

```
6
4 3 0 5 1 2
```

样例输出 1

```
0 0 0 3 1 2
```

提示

对于 100\% 的数据,1 \leq n\leq 100$,$0 \leq a_i \leq 10。

参考答案

#include<iostream>
using namespace std;
int n, s[10000] = { 0 };
int iecne[10000];
int k = 0;
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> iecne[i];         //输入
	}
	for (int i = 1; i <= n; i++)     //从第一个小鱼开始循环
	{
		for (int j = 1; j < i; j++)  //在小鱼之前的所有小鱼循环
		{
			if (iecne[i] > iecne[j]) //比较
			{
				//s++;
				s[k]++;              //统计
			}
		}
		k++;                         //由于我们没有数值可以当作输出数组,所以新建一个变量k在每一个循环结束后增加
		//cout << s << " ";          //这里也可以直接输出,但是影响美观
	}
	for (int i = 0; i < n; i++) cout << s[i] << " "; //最后数组出书输出
}

题目思路

在写的时候傻掉了,其实没有必要用k统计,直接用i不就好了?


2.小鱼的数字游戏

题目描述

小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 a_iai​(长度不一定,以 00 结束),记住了然后反着念出来(表示结束的数字 00 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。

输入格式

一行内输入一串整数,以 00 结束,以空格间隔。

输出格式

一行内倒着输出这一串整数,以空格间隔。

输入输出样例

输入

3 65 23 5 34 1 30 0

输出 

30 1 34 5 23 65 3

说明/提示

数据规模与约定

对于 100\%100% 的数据,保证 0 \leq a_i \leq 2^{31} - 10≤ai​≤231−1,数字个数不超过 100100。

参考答案

#include<iostream>
using namespace std; 
int x[100],c=0;
int main()
{
    for(int i=0;;i++)
    {
        cin>>x[i];
        if(x[i]==0) break;   //输入到0的时候直接跳出
        c=i;                 //在0的时候不会统计(统计最后一个的位置)
    }
    for(int j=c;j>=0;j--)  cout<<x[j]<<" ";  //其实只有一行的时候可以不打括号
    return 0;
}

题目思路

本题就是普普通通的倒着输出,其中统计了最后一个的位置,再用循环倒着输出就ok了


3.冰雹猜想

题目描述

给出一个正整数 nn,然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 33 再加 11,否则除以 22。经过若干次循环后,最终都会回到 11。经过验证很大的数字(7\times10^{11}7×1011)都可以按照这样的方式比变成 11,所以被称为“冰雹猜想”。例如当 nn 是 2020,变化的过程是 20\to 10\to 5\to 16\to 8\to 4\to 2\to 120→10→5→16→8→4→2→1。

根据给定的数字,验证这个猜想,并从最后的 11 开始,倒序输出整个变化序列。

输入格式

输入一个正整数 nn。

输出格式

输出若干个由空格隔开的正整数,表示从最后的 11 开始倒序的变化数列。

输入输出样例

输入 

20

输出

1 2 4 8 16 5 10 20

说明/提示

数据保证,1 \le n\le 1001≤n≤100。

参考答案

#include<cstdio>
using namespace std;
int a[10005];
int cnt;
int main()
{
    int n;
    scanf("%d",&n);
    int tmp=1;
    printf("1 ");
    while(n!=1)
    {
    	if(n%2==0)
    	{
    		a[++cnt]=n;
    		n=n/2;
    	}
    	else
    	if(n%2==1)
    	{
    		a[++cnt]=n;
    		n=n*3+1;
    	}
    }
    for(int i=cnt;i>=1;i--)
    {
    	printf("%d ",a[i]);
    }
    return 0;
}

这题其实不用注释,看题目解析就行

题目思路

首先我们来看一看题目,得出了下列信息:

1.如果为奇数就*3+1

2.如果为偶数就/2

只需要模拟n变化为1的过程,然后存到一个数组中倒序输出


4.[NOIP2005 普及组]校门外的树

题目描述

某校大门外长度为 ll 的马路上有一排树,每两棵相邻的树之间的间隔都是 11 米。我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 ll 的位置;数轴上的每个整数点,即 0,1,2,\dots,l0,1,2,…,l,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式

第一行有两个整数,分别表示马路的长度 ll 和区域的数目 mm。

接下来 mm 行,每行两个整数 u, vu,v,表示一个区域的起始点和终止点的坐标。

输出格式

输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。

输入输出样例

输入

500 3
150 300
100 200
470 471

输出 

298

说明/提示

【数据范围】

  • 对于 20\%20% 的数据,保证区域之间没有重合的部分。
  • 对于 100\%100% 的数据,保证 1 \leq l \leq 10^41≤l≤104,1 \leq m \leq 1001≤m≤100,0 \leq u \leq v \leq l0≤u≤v≤l。

【题目来源】

NOIP 2005 普及组第二题

参考答案

这是一道很经典的题目了吧?

#include<bits/stdc++.h>
using namespace std;
int l,i,j,s,n,a[10001],k,c;
int main( )
{
    cin>>l>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>k>>s;
        for(int j=k;j<=s;j++)
        {
            a[j]=1; 
        }    
    }
    for(int i=0;i<=l;i++)
    {
        if(a[i]==0)
        {
            c++;
        }
    }
    cout<<c;
    return 0;
}   

题目思路

思路很简单,利用0和1标记,若已经移树,则为1.

直接在输入的循环里判断、标记。

最后再过一遍,计数


三.总结

本节课主要是讲解了一维数组的练习题目,相信大家对这个逻辑有了一定的理解,大家可以自己动手敲敲代码,感受一下,下一节课就开始讲解一维数组的题目了,请大家继续关注。

包教包会,帅的人已然点赞收藏关注,而丑的人还在犹豫,被犹豫了,快三连吧!


 系列文章目录

 本期收录于博主的专栏——C++保姆级入门教程,适用于编程入门初学者,感兴趣的朋友们可以订阅,查看其它内容教程。

C++保姆级入门教程_iecne的博客-CSDN博客

C++保姆级入门教程(1)   变量 输出 输入

C++保姆级入门教程(2)   算术运算和赋值

C++保姆级入门教程(3)   if语句

C++保姆级入门教程(4)   循环

C++保姆级入门教程(5)   顺序结构

C++保姆级入门教程(6)   分支结构

C++保姆级入门教程(7)  循环结构

C++保姆级入门教程(8)  分支拓展

C++保姆级入门教程(9)  一维数组基础

C++保姆级入门教程(10) 一维数组练习


感谢每一个观看本篇文章的朋友,更多精彩敬请期待:iecne的博客_CSDN博客-C++保姆级入门教程领域博主

文章存在借鉴,如有侵权请联系修改删除!

猜你喜欢

转载自blog.csdn.net/CSDN_linyanchen/article/details/126076244