c++数组

本章讲的是C++语言中最重要的数组,以下附上一道例题

https://www.luogu.org/problemnew/show/P2141#sub

让我们先来梳理一下题意:将给定的数中两个不同的数之和如果等于另一个数,那么就符合标准,最后算出到底有几个这样的另一个数

那么我们会发现,我们需要保存n个数,但是n是需要输入的,数量不确定,不能用a,b,c这样去定义。所以我们要用到数组,以下介绍一下数组

一.一维数组

定义模板为: 类型名 数组名[数组最大个数]

如:int a[100001]

定义一个有100001个位置的int类型的a数组

那么有几点注意事项:

1.数组名与类型名这些与变量名是差不多的;

2.[]里面的数组最大个数是指要存进里面的数字的个数最多是多少,必须是正整数;

3.[]里面的数如果太大,会申请的空间太大,不符合要求,会整题没分;如果太小,需要申请的空间在里面容不下,就会越界;

示意图:

a[0]

a[1]

a[2]

a[3]

a[4]

a[5]

a[6]

a[7]

a[8]

a[9]

每个数组都有这样一个空间,也有各自的下标。

应用模板为:数组名[下标]

如:a[1]=b[1]

将b[1]的值赋给a数组1位置

如果你要调用a[0]里面的数的话,就直接这样写就好了

初始化模板:数组名[数组最大个数]={数字(第一个位置就是下标为0时候的数字)}

如:a[3]={1,2,3}

a[1]=1 a[2]=2 a[3]=3

那么现在那道题可以用这样的步骤:

PS:这道题用的是一种比较特别的方法,类似于桶排,以后讲到排序时会讲。

1.设置两个桶各自来体现数列之中两个数的和与数列中的数是否存在;

2.将数列输入,并将它们装进桶里,标记为已知,之后双重循环枚举标记两数之和为已知;

3.最后进行循环比较,如果某数在两个不同类型的桶中都有标记的话,就说明该数符合要求,计数器(设置一个变量为计数器)加一

代码如下:

#include<iostream>

using namespace std;

int a[100001],s=0,n;//a数组是要求输入的数列,n是要求输入的数列长度,s为计数器,记得归零,不然不知从哪加

bool b[100001]={0},c[100001]={0};//b数组标记两数之和是否存在,存在值为1,如:下标为1的数组值为1,则说明数列之中有两数之和为1;c数组则是标记数列中的数是否存在

int main(){

cin>>n;

for(long long i=0;i<n;i++){

cin>>a[i];

c[a[i]]=1;

}//输入并标记

for(long long i=0;i<n;i++){

for(long long j=i+1;j<n;j++){

b[a[i]+a[j]]=1;

}

}//双重循环,将所有数的和枚举并标记,不懂可以看我上一篇博客

for(long long i=0;i<100000;i++){

//记得不能在这个位置写s=0,因为它没循环一次,就会归一次0,那之前记的数就作废了

if(c[i]==1&&b[i]==1){

s++;

}

}// 循环进行判断,看有没有数符合两个特征,枚举到100000是因为数据范围中写每个数的大小不超过10000,所以两数之和不会超过20000,但保险起见,枚举到100000

cout<<s<<endl;

return 0;

}//其他的皆是基础结构,不懂得可以看我之前的博客

那么继续来讲一下二维数组

应用模板为:数组名[下标][下标]

PS:这个数组所占空间为两个下标相乘之积,其他与一维数组相同。

给大家推荐几道题

https://www.luogu.org/problemnew/show/P1567

https://www.luogu.org/problemnew/show/P1149

https://www.luogu.org/problemnew/show/P1217

https://www.luogu.org/problemnew/show/P1579

https://www.luogu.org/problemnew/show/P1307

————————————————

版权声明:本文为CSDN博主「时光无印,岁月无痕」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_41712886/article/details/82951831

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值