PAT甲级常用函数&操作备忘
数组
数组的创建
-
可变长一维数组(长为m)
cin>>m; vector<int>v(m);
-
可变长二维数组(m行5列)
cin>>m; vector<vector<int>> v(m, vector<int>(5));
数组的初始化
-
对于定长数组,通常有如下操作:
#include<string.h> int a[5]; memset(a,0,sizeof(a));
-
对于vector数组不能使用memset指令,但可以转换思路,既然是初始化数组,就相当于一个新的数组了,故可以直接新建一遍,相当于初始化。
vector<int>v(5,0);//长度为5,内容填充0 cout<<v[1]<<endl;//输出0 vector<int>v(5,1);//长度为5,内容填充2 cout<<v[1]<<endl;//输出1
数组的排序
vector<int>v;
//整段排序
sort(v.begin(),v.end());
//对字段下标为[i,i+len)的长为len的字段排序
sort(v.begin()+i,v.begin()+i+len);
数组的输出控制(中间空格,末尾换行)
for(int i=0;i<n;i++)
printf("%d%c",a[i]," \n"[i==n-1]);
数值运算
平方、开方、绝对值计算
#include <math.h>
//平方
int a = pow(4,2);// 4的平方=16
//开方
int b = pow(4,0.5);// 4的平方根=2
int c = sqrt(4);// 4的平方根=2
//整数绝对值
int c = abs(b-c);
//浮点数绝对值
double d = fabs(b-c);
位运算
若给每个二进制位赋予一个答案含义,比较两串答案的操作可以化成二进制进行比较。
位运算操作 | 符号 | 含义 |
---|---|---|
按位与 | & | (取交集)同为1才是1,其余为0 |
按位或 | | | (取并集)只要有1,就是1 |
按位异或 | ^ | 不同就是1,相同取0 |
取反 | ~ | 0变1,1变0 |
左移 | << | |
右移 | >> |
例如四选二的题目里标准答案是ac,学生答案是bc有
true_opt=hash['a'-'a']+hash['c'-'a'];//ac: 101 (5) opt=hash['b'-'a']+hash['c'-'a']//bc: 110 (6) //亦或运算,找区别 if((true_opt^opt)==0)cout<<"与正确答案一致";//标记出和标准答案不一样的选项 else cout<<"与正确答案不一致"; //或运算后判断相等,看有无错选 if((true_opt|opt)==true_opt)cout<<"学生答案是正确答案子集,没有多选错误答案"; else cout<<"出现正确答案之外的选项"; //与hash表的交若不为0,则当前hash表的值对应选项已被选中 for (int k = 0; k < 4; k++) if ( (true_opt^opt) & hash[k]) printf("%c",'a'+k);//通过与hash的二进制位依次比较,获得已选答案
最大公约数
int gcd(int a,int b)
{
return !b?a:gcb(b,a%b);
}