数组
1.浮点数比较
c++中浮点数由于精度的问题,会导致输入输出的数可能会不相等。一般在浮点数的判断中会给一个可以容忍的误差 |x-y|<=10^-6^ ;判断时可以定义一个误差变量,小于这个变量即视为相等;
2.一维数组的应用(高精度运算)
如题,计算2的N次方,N<=10000; int是32位二进制,对应十进制是10位,无法满足要求;因此采用数组存储;代码如下:
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 3010;//定义可以容纳2的10000次方最大的数组长度
int main()
{
int a[N] = {1};
int n;
cin>>n;
int m=1;
for(int i=0; i<n; i++){
int t = 0;
for(int j = 0; j<m ; j++){
t += a[j]*2;
a[j] = t%10;
t = t/10;
}
if(t) a[m++] = 1; //判断如果最高位的t为1有进位,则运算长度m加1
}
for (int i = m-1; i>=0; i--){ //大的数存储在后面,即为小端存储,方便进位运算
cout<<a[i];
}
cout<<endl;
return 0;
}
3.二维数组
1.二维数组的定义 如:a[2][3]等等;
2.数组初始化方式 使用memset()函数;
- 在
#include<cstring>
库中;- memset(a,0,len); 其中a为数组名,0为初始化的值(赋给每个字节值,一个int32位,每8位赋值)只有赋值为0或-1时才相等,len为初始化多长(单位为字节);
- len可以用sizeof()函数,如size(a)返回a的字节大小;
3.可以直接复制数组,使用memcpy()函数;
- 用法与memset函数类似,memcpy(b,a,sizeof a);将a数组中的元素复制到b数组中;
4.课堂练习
1.输入时使用cin>>可以自动忽略空格和换行;而使用scanf()时碰到空格和换行认为输入停止,实在要输入时可以手动输入覆盖掉;使用scanf()编译效率更高;
2.回型矩阵,如题所示[Acwing753.回型矩阵]
输入整数 N,输出一个 N 阶的回字形二维数组。
数组的最外层为 11,次外层为 22,以此类推。
输入格式
输入包含多行,每行包含一个整数 N。
当输入行为 N=0 时,表示输入结束,且该行无需作任何处理。
输出格式
对于每个输入整数 N,输出一个满足要求的 N阶二维数组。
每个数组占 N 行,每行包含 N个用空格隔开的整数。
每个数组输出完毕后,输出一个空行。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n;
while(cin>>n && n){
for(int i = 1; i<=n; i++){
for(int j = 1; j<=n; j++){
int up = i, down = n-i+1, left = j, right = n-j+1; //分别算出数组中的数距离上下左右边的最小值
cout<<min(min(up,down),min(left,right))<<' ';
}
cout<<endl;
}
cout<<endl;
}
return 0;
}
如上述代码所示,利用曼哈顿距离(常用技巧);
对于一个二维数组,分别算出其距离这个数组上下左右四条边的最小值,其数值及对应这个最小值;
3.蛇形矩阵,如图所示 [Acwing756.蛇形矩阵]
代码为:
#include<iostream>
using namespace std;
int res[110][110]; //定义在全局变量,自动初始化为0
int main()
{
int n,m,dx[] = {-1,0,1,0},dy[] = {0,1,0,-1};//定义每次移动的偏移量
int a,b,x=0 ,y=0 ,d = 1;
cin>>n>>m;
for(int i = 1; i<=n*m; i++){
res[x][y] = i;
a = x + dx[d]; b = y + dy[d];
if(a<0 || a>=n || b<0 || b>=m || res[a][b]){//判断撞墙条件
d = (d+1)%4;//撞墙后改变移动方向
a = x + dx[d]; b = y + dy[d];
}
x = a; y = b;
}
for(int i = 0; i<n ; i++){
for(int j = 0; j<m ; j++){
cout<<res[i][j]<<" ";
}
cout<<endl;
}
return 0
代码思路为:利用偏移量计算(常用技巧),对于每次移动都对应一个移动方向,即偏移量;每移动一次加上一次偏移量;当移动的过程中撞墙后,移动方向会发生改变;