天天看点

8.3 回顾总结

  

一、数组的操作

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++;