1.数组定义在函数外面
不用初始化默认为0,不占用栈空间,用堆空间
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+10;
int x[N];
int f[N];
signed main(){}
#define int long long
防止你忘记开long long,还有就是这样可以直接敲int,快一些。
不过要配套的改一下主函数前面的前缀 signed main(){}
,不能用int了, 因为主函数的返回值应该是0或者1
2.数组变换
(1)直接输出的暴力解法
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int n[21];
for(int i=0;i<20;i++){
cin>>n[i];
}
for(int j=19;j>=0;j–){
cout<<”N[“<<(19-j)<<”] = “<<n[j]<<endl;
}
}
(2)设两个相反数组解法
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int a[21],b[21];
for(int i=0;i<20;i){
cin>>a[i];
}
for(int j=19,i=0;j>=0;j–-,i++){
b[j]=a[i];
}
for(int i=0;i<20;i++){
cout<<”N[“<<i<<”] = “<<b[i]<<endl;
}
}
3.反转字符串
// 反转整个字符串
reverse(s.begin(),s.end());
// 反转两个字符
swap(s[i],s[j]);
4.定义不知道长度的数组
(1)定义一个一维数组
使用花括号 {}
直接赋值,数组大小由初始化的元素个数决定
int a[]={1,2,3,4,5};
如果手动定义数组长度,比如 double ary[5] = {1, 2, 3};
,未初始化的元素会被默认填充为 0.0
尽量不使用变量定义数组长度,例如 int n = 10; double ary[n];
在部分版本编译器中会报错
(2)定义并初始化数组
{0,}
代表 第一个元素初始化为 0
,其余元素自动填充为 0
,等价于 int ans[10] = {0};
int a[10]={0,};
仅初始化第一个元素为 1,其他自动填充 0
int a[10]={1};
(3)使用 memset
进行内存初始化
memset(指针, 值, 大小)
初始化字节块 的函数。memset
逐字节填充 127
,即 01111111
,对应 ASCII DEL
memset(a,127,sizeof(a));
char
数组清零
char str[20];
memset(str,0,sizeof(str));
int
数组全部填充 0
memset(ans,0,sizeof(ans));
int
数组全部填充 -1
memset(ans,-1,sizeof(ans));
(4)大规模数据处理
const int N=2e5+10;
int A[N];
int B[N];
(5)使用 for
循环赋值
for(int i=-;i<n;i++){
a[i]= 赋值语句;
}
5.斐波那契数列
注意大数值用long long
,打印时用"%lld".
cout优点就是不用考虑变量的类型,可直接用cout
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+10;
int x[N];
int f[N];
signed main(){
int a;
cin>>a;
f[0]=(int)0;
f[1]=(int)1;
for(int i=0;i<a;i++){
cin>>x[i];
}
for(int i=2;i<61;i++){
f[i]=f[i-2]+f[i-1];
}
for(int j=0;j<a;j++){
cout<<"Fib("<<x[j]<<") = "<<f[x[j]]<<endl;
//printf("Fib(%d) = %lld\n",x[j],f[x[j]]);
}
}