一、数组的操作
1、 查找
查找一个数是不是在数组里,是的话是数组里的第几个数。
int x;
cin>>x;
int a[110];
for (int i=1;i<=n;i++)
if (a[i]==x) cout<<i<<endl;
2、 删除
删除数组中第k个数
for (int i=k;i<n;i++) a[i]=a[i+1];
n--;
3、 插入
将一个数x插到第k个位置
for (int i=n;i>=k;i--) a[i+1]=a[i]; //先把第k个元素的位置给腾出来。
a[k]=x;
n++;
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 2 6 11
4、 平移
将一个数组里的元素整体向左平移,第一个元素放到第n个元素的位置
int temp=a[1];
for (int i=1;i<n;i++) a[i]=a[i+1];
a[n]=temp;
二、几道典型例题
1、校门外的树
2、有长度为n的一圈整数,要在n个数中找m个连续整数和最大和最小。现要求输出最大连续m个数的起始数的和下标和最小连续m个数的起始数的和下标。
输入:
6 3
2 3 5 7 9 11 (n个数,但是11和2也是连着)
输出
4(最大3个数的和是7+9+11,7的下标是4)
1(最小3个数的和是2+3+5,2的下标是1)
**数据范围:n<=300,m<=20, 0<=每个整数<=10000。
【分析】什么叫连续?如果不是圆圈,怎么做。
穷举所有连续的m个数的和。然后比较,并记录下其相应的最大值和最小值,并要记录最大值和最小值的下标。
所有的m个连续数的和的起始位置应该从1 到 n-m+1(最外层的循环)。好好思考n-m+1的由来。(如果不确定,用具体例子来验证)
连续m个数累加,如何求?
求出一个m个数累加和后,要和max和min比较,除了要更新max和min的值,还要记录下这个m个数累加和的起始位置(用于输出)。
3、输入一个自然数n,求这个自然数的所有约数之和。N<=2*10^9
输入:6
输出:12
Cin>>n;
For(int i=1;i<=sqrt(n);i++)
If(n%i==0)
{sum=sum+I;
If (i!=n/i) Sum=sum+n/I;
}
36
1 2 3 4 6
36 18 12 9
4、给定一个数,判断是不是素数,如果是的话输出yes,否则的话输出no
输入:5 输入:6
输出:yes 输出:no
Cin>>x;
Bool Flag=1;
For( int i=2;i<=x-1;i++ )
{ if ( x%i==0 )
flag=0;
break;
}
If(flag==1&&x)
校门外的树
一、L+1点 存在
二、M个区域 s end 不存在
Bool a[10010];
For(int i=0;i<=L;i++) a[i]=1;
For(int j=1;j<=m;j++)
{
Cin>>s>>end;
For(int k=s;k<=end;k++)
A[k]=0; a[i]=!a[i]
}
For(int i=0;i<=l;i++)
If (s[i]==1) num++;