1.12 一维数组
1.12 一维数组
1. 一维数组知识点
数组:同类型变量或对象的集合
1.定义:
在C++语言中,一维数组的定义方法:类型名 数组名[元素个数];
数组中的变量称为为数组元素,由于数组中每个元素都有下标,因此数组元素也称为下标变量。
数组下标取值从0开始,使用数组时下标不能越界,同一数组的所有数组元素在内存中占用一片连续的存储单元。
例如:int num[10];
定义了一个名字为 num 的数组,它有10个元素,每个元素都是一个int型变量,下标变量为num[0]~num[9],num数组占用了一片连续的、大小为10*sizeof(int)字节的空间。
2.引用:
每个数组元素都是一个变量,数组元素可以表示为:数组名[下标]
其中,下标可以是任何值为整型的表达式,该表达式里可以包含变量和函数调用。引用时,下标值应在数组定义的下标值范围内。
例如:若i、j都是int型变量,则 num[5]、num[i+j]、num[i++] 都是合法的元素。
在定义一个一维数组的同时,可以给数组中的元素赋初值。
格式:类型名 数组名[元素个数]={值1,值2,……};
例如:int a[10]={0,1,2,3,4,5,6,7,8,9};
相当于
a[0]=0
a[1]=1
a[2]=2
……
a[9]=9
C++语言规定,使用数组时,要注意:
(1)数组下标为正整数
(2)在定义元素个数的下标范围内使用
当在程序中把下标写成负数或者大于元素个数时,程序编译不会出错。
3.作用域
根据数组定义的位置,我们将数组分为全局变量和局部变量
全局变量:是指不被{}包裹起来的变量;
局部变量:是指被{}包裹起来的变量。
并且编译器会给这些数组变量初始化不同的值,具体如下:
全局变量,默认初始化为 0.
局部变量,随机初始化一个值.
局部变量,部分赋值,则未赋值部分初始化为 0.
#include<iostream>
#include<cstdlib>
using namespace std;
const int N=1e3;
int a[N];//全局变量,默认初始化为 0
int main(){
int b[N];//局部变量,随机初始化一个值
int c[N]={0,1,2,3};//局部变量,部分赋值,则未赋值部分初始化为 0
for(int i=0; i<10; i++){
cout<<a[i]<<" ";
}cout<<endl;
for(int i=0; i<10; i++){
cout<<b[i]<<" ";
}cout<<endl;
for(int i=0; i<10; i++){
cout<<c[i]<<" ";
}cout<<endl;
for(int i=0; i<10; i++) {
a[i]=rand()%100;//随机一个数 [0,99], 头文件:cstdlib
}
for(int i=0; i<10; i++){
cout<<a[i]<<" ";
}cout<<endl;
return 0;
}
输出结果:
a[N]: 0 0 0 0 0 0 0 0 0 0
b[N]: 0 0 2447244 0 0 0 -46922866 2046 0 0
c[N]: 0 1 2 3 0 0 0 0 0 0
a[N]: 41 67 34 0 69 24 78 58 62 64
2. 读入n个整数将其反向输出
【题目描述】读入n个整数将其反向输出 (n<=10000)
输入样例:
5
45 12 34 89 21
输出样例:
21 89 34 12 45
【题解】
#include<iostream>
using namespace std;
const int N=1e4;//定义一个常量 N=1e4=10000
int a[N];
int main(){
int n; cin>>n;
for(int i=0; i<n; i++){// [0, n-1]
cin>>a[i];//输入并赋值给 a[i]
}
for(int i=n-1; i>=0; i--){// [n-1, 0]
cout<<a[i]<<" ";
}
return 0;
}
3. 最大值所在位置
【题目描述】输入n个整数,存放在a[1]~a[n]中,输出最大值所在位置(n<=10000)。
【题解】
#include<iostream>
using namespace std;
const int N=1e4;
int a[N];
int main(){
int n, max=-1, max_i=-1; cin>>n;
for(int i=1; i<=n; i++){
cin>>a[i];
if(a[i]>max) {//如果 a[i]比最大值大
max = a[i];//最大值发生改变
max_i = i; //最大值的下标发生改变
}
}
cout<<max_i;
return 0;
}
4. 斐波那契数列
【题目描述】斐波那契数列指的是这样一个数列:0,1,1,2,3,5,8,13,21... 求数列的前100项,并按照从大到小的顺序输出。
可以用数组f[100]来存储这个数列的前100项
f[0]=0
f[1]=1
…
f[n]=f[n-1]+f[n-2]
使用for循环进行计算,然后再倒序输出
【题解】
#include<iostream>
using namespace std;
const int N=1e2+10;
unsigned long long a[N]={0,0,1};// [0, 2^64]
// 0, 1, 1, 2, 3, 5, 8, 13, 21...
int main(){
int n=100;
for(int i=3; i<=n; i++){
a[i]=a[i-1]+a[i-2];
}
for(int i=1; i<=n; i++){
cout<<a[i]<<endl;
}
return 0;
}
5. 第几天
【题目描述】输入年、月、日,输出该天是这一年的第几天。
分析:设year表示年,month表示月,date表示日,ans表示求得的答案,那么ans值就是month之前月份的天数之和加上date。
如果不考虑闰年,则每个月的天数是固定的,我们可以用数组a来存储每个月的天数。
具体步骤:
(1)初始化数组a,其值为每个月的天数
(2)读入year、month和date
(3)求month之前月份天数之和加上date,则为这是平年的第几天
(4)判断year是否是闰年,如果是闰年,那么,当month是2月之后的月份,ans就要加上一天。
输入样例:2021 8 24
输出样例:236
【题解】
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
int y,m,d; cin>>y>>m>>d;
if(m>2){
//如果月份大于2月,且为闰年,则加一天
if(y%400==0||y%4==0&&y%100!=0) a[1]++;
}
int day=d;
for(int i=0; i<m-1; i++){
day+=a[i];//累积前m-1月的天数
}
cout<<day;
return 0;
}
6. 起立与坐下
【题目描述】有n个人,编号为1~n。开始时,所有人都站着,接着第2个人和2的倍数的人坐下,然后,第3个人及3的倍数的人按相反的操作(坐的人站起来,站着的人坐下),依次类推,一共操作到第k人及k的倍数。问最后有哪些人站着。输入n和k,输出站着的人的编号。
输入样例:7 3
输出样例:1 5 6 7
【题解】
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=1e4;
int a[N]; //0表示站着,1表示坐着
int main() {
int n,k; cin>>n>>k;
for(int i=2; i<=k; i++) {
for(int j=1; j<=n; j++) {
if(j%i==0) a[j]=!a[j];//取反
}
}
for(int i=1; i<=n; i++){
if(a[i]==0) cout<<i<<" ";
}
return 0;
}
7. 排序
【题目描述】输入n个数,存在数组a中,每个数都是介于0~k之间的整数,此处k为某个整数(n<=100000,k<=1000),按从小到大的顺序,输出a数组中的数据。
输入样例:
10
2 3 1 2 4 55 3 55 3 2
输出样例:
1 2 2 2 3 3 3 4 55 55
【题解】
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=1e5;
int a[N];
int main(){
int n,k=1000; cin>>n;
for(int i=1; i<=n; i++){
int x;cin>>x;
a[x]++;//桶排序的思想
}
for(int i=0; i<=k; i++){
for(int j=1; j<=a[i]; j++){//循环a[i]次
cout<<i<<" ";
}
}
return 0;
}
int main_ac(){
int n; cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
sort(a+1, a+1+n);//直接快速排序
for(int i=1; i<=n; i++) cout<<a[i]<<" ";
return 0;
}