2019-12-24

数组学习总结

数组是把相同格式类型的数据元素组合到一起的的容器或者说是工具。有了数组这个工具,我们的代码和编程工作变得极为方便,不用一个一个定义数据了。一个数组在内存中占据一片连续的存储单元。
数组包含一维数组和多维数组。
一、数组知识总结及使用过程中的注意事项:
1、数组大小必须是指值为正的常量,不能为变量。一旦定义不能改变大小。
2、数组大小最好用宏来定义。
3、数组定义后需要赋初值,不然仍然是随机数。4、 对数组的赋值可用循环来做,二维数组用循环嵌套赋值或是输入输出。包含在头文件#include中的函数memset可以对数组进行清零处理,但不可以对整型变量进行正常赋值,因为memset是对字节赋值的,对char类变量单个赋值是没有问题的。
5、int a[5]={}表示数组中的5个元素都初始化为0。int a[10]={0,1,2}表示对数组前三个元素赋值为0.1.2,其余元素赋值为0。
二、关于字符数组举例:'a’表示一个字符,只有字符a,而"a"是字符串,包含a和\0。引用字符空格应用单引号。输入问题:由scanf得到的字符串不会有空格,回车即使下一段。使用gets只能输入一个字符串,可以得到包含空格的字符串。个人感觉做题的时候scanf比cin好用,效率更高。puts语句输出一个字符串和一个换行符。
三、还是那句话,基本语法本身并不难理解,关键在于运用。如何将语法知识组合起来形成算法思路才是我们要考虑的最大问题。
1.二分查找这是一种效率极高的算法,也算是一种找数据时的优化方案。

low=0,high=n-1,mid=0;
		    while(low<=high)		    {                    mid=(low+high)/2;                    if(a[mid]>temp)                        high=mid-1;                    else if(a[mid]<temp)                              low=mid+1;                            else                              couture<<a[mid]<<endl;                           } cout<<"Not Found!"<<endl;}  

2.筛法
利用这种算法可以提高效率。例5.7 用筛法求出100以内的全部素数,并按每行五个数显示。【问题分析】   ⑴ 把2到100的自然数放入a[2]到a[100]中(所放入的数与下标号相同);   ⑵ 在数组元素中,以下标为序,按顺序找到未曾找过的最小素数minp,和它的位置p(即下标号);   ⑶ 从p+1开始,把凡是能被minp整除的各元素值从a数组中划去(筛掉),也就是给该元素值置 0;   ⑷ 让p=p+1,重复执行第②、③步骤,直到minp>floor(sqrt(N)) 为止;   ⑸ 打印输出a数组中留下来、未被筛掉的各元素值,并按每行五个数显示。  用筛法求素数的过程示意如下(图中用下划线作删去标志):① 2 3 4 5 6 7 8 9 10 11 12 13 14 15…98 99 100 //置数② 2 3 4 5 6 7 8 9 10 11 12 13 14 15…98 99 100 //筛去被2整除的数③ 2 3 4 5 6 7 8 9 10 11 12 13 14 15…98 99 100 //筛去被3整除的数   …… 2 3 4 5 6 7 8 9 10 11 12 13 14 15…98 99 100 //筛去被整除的数

#include<iostream>
 #include<math.h>     #include<iomanip> using namespace std; const int n=100; int t; bool a[n+1]; int main() {   for (int i=0; i<=n; ++i) a[i]=true;           a[1]=false;     for (int i=2; i<=sqrt(n); ++i)       if (a[i])         for (int j=2; j<=n/i; ++j)           a[i*j]=false;                t=0;     for (int i=2; i<=n; ++i)       if (a[i])        {           cout<<setw(5)<<i;           t++;           if (t%5==0) cout<<endl;       }      return 0; }

四、oj题目分析
1、倒置排序
总时间限制: 1000ms 内存限制: 32767kB
描述
将一些整数按倒置值排序后输出. 所谓倒置,是指把整数各位倒过来构成一个新数,例如:13倒置成了31.输入第一行的整数N表示后面列出的组数。每组数的第一个整数n表示后面将有n个整数。(每组数据量不超80)输出将每组数按倒置值进行排序输出.其每组数的结果占一行.
样例输入
2
4 83 13 24 36
4 99 100 123 12345
样例输出
13 83 24 36
100 99 123 12345
代码


#include<iostream>
#include<cmath>int a[1001],c[1001];using namespace std;int main(){ int N,n,b,s; cin>>N; for(int i=1;i<=N;i++) {cin>>n; for(int j=1;j<=n;j++){ s=0;	 cin>>b;	a[j]=b; while(b!=0){ s=s*10+b%10; b/=10;} c[j]=s;}for(int j=1;j<=n-1;j++)for(int k=1;k<=n-j;k++) if(c[k]<c[k+1]){swap(c[k],c[k+1]);swap(a[k],a[k+1]);}for(int j=n;j>=1;j--) cout<<a[j]<<" "; cout<<endl;}	return 0;}

2、扫雷游戏是一款十分经典的单机小游戏。它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷。
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷数。注:每个格子周围格有八个:上、下、左、右、左上、右上、左下、右下。输入第一行包含两个整数n和m,分别表示雷区的行数和列数。1 <= n <= 100, 1 <= m <= 100。接下来n行,每行m个字符,‘’表示相应格子中是地雷,‘?’表示相应格子中无地雷。字符之间无任何分隔符。输出n行,每行m个字符,描述整个雷区。若相应格中是地雷,则用‘’表示,否则用相应的周围格地雷数表示。字符之间无任何分隔符。
样例输入
3 3
??
???
?
?
样例输出
10
221
1
1
代码

#include<iostream>
using namespace std;char a[1010][1010];int b[1010][1010];int main(){    int m,n,x;	cin>>m>>n;	for(int i=1;i<=m;i++)	{		for(int j=1;j<=n;j++)		{			cin>>a[i][j];}}						for(int i=1;i<=m;i++)			{for(int j=1;j<=n;j++)				{					x=0;					if(a[i][j]=='*') cout<<"*";					else {if(a[i][j-1]=='*')  x++;						  if(a[i+1][j-1]=='*') x++;						  if(a[i+1][j]=='*') x++;						  if(a[i+1][j+1]=='*') x++;						  if(a[i][j+1]=='*') x++;						  if(a[i-1][j-1]=='*') x++;						  if(a[i-1][j]=='*') x++;						  if(a[i-1][j+1]=='*') x++;						                    						  b[i][j]=x;			cout<<b[i][j];}}			cout<<endl;}			return 0;			}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值