come on!
- 啊,到了考场用DevC++的时候,在编译选项中,勾选上-std=c++11 很重要!!!
- (2020/3/18更新)考场上的PAT答题环境虽然和平时训练时几乎是1:1的,但是不像平时有代码提示的~
- 使用 #include<bits/stdc++.h> 这个万能头文件很省事~ 但是使用万能头文件编译时间可能略长。。。可能会造成程序超时!
- 可以使用C语言中的 scanf 和 printf 来进行输入输出,因为使用 cin 和 cout 存在一个缓冲区的刷新,时间较慢,可能会造成程序超时。
- map使用方法:
- set使用方法:
- 判断一个数是否为素数(2是素数!!!1不是素数)第一个素数是2
bool isprime(int a) {
for (int i = 2; i * i <= a; i++)
if (a % i == 0) return false;
return true;
}
- 当使用 while(cin >> s) 语句时,停止输入是Ctrl+Z+回车
- C++ STL 栈 stack 的用法
#include <iostream> #include <stack> using namespace std; int main() { stack<int> s; // 定义⼀个空栈s for (int i = 0; i < 6; i++) { s.push(i); // 将元素i压⼊栈s中 } cout << s.top() << endl; // 访问s的栈顶元素 cout << s.size() << endl; // 输出s的元素个数 s.pop(); // 移除栈顶元素 return 0; }
- C++ STL 队列 queue 的使⽤
#include <iostream> #include <queue> using namespace std; int main() { queue<int> q; // 定义⼀个空队列q for (int i = 0; i < 6; i++) { q.push(i); // 将i的值依次压⼊队列q中 } cout << q.front() << " " << q.back() << endl; // 访问队列的队⾸元素和队尾元素 cout << q.size() << endl; // 输出队列的元素个数 q.pop(); // 移除队列的队⾸元素 return 0; }
注意,如果是个结构体队列,eg. queue<node> q; 入队时,可以 q.push({a, b}); 在这一点上,栈也是一样的。
-
#include <cmath>使用 C++(g++) 提交会出错? 额,我也不知道这是为什么。之前刷题遇到的 ---> 1007 素数对猜想
-
千万注意题干对于空格、换行输出的要求,否则提交的代码会报 “格式错误”
-
long long 用起来!!!详情
int: -2^31~2^31-1(十进制-2147483648~2147483647) -> 以下使用无误
long long: -2^63~2^63-1 十进制
- memset(e,-1,sizeof(e)); 把矩阵e的所有元素初始化为-1 #include<memory.h>
- char->int :a2=a1-'0' ; int->char: a2=a1+'0'.
- 判断char类型的变量是不是数字isdigit(变量名);判断char类型的变量是不是字母isalpha(变量名)。
- scanf(" %c",&grade); // 注意%c前面有一个空格
- s.substr(i,k):截取子字符串 从下标i开始截取k个字符. s.substr(i): 截取子字符串 从下标i开始截取到s的最后
- 输入一整行的string类型(eg.带空格的字符串),要使用getline(cin,s); c: scanf("%[^\n]");
- 如果cin或scanf()后有读入一整行的操作例如getline(cin,s),需要在cin、scanf()后加一个getchar()。
- printf("%s", xxx.c_str()); //使用printf打印字符串变量要小心,在变量名后加 .c_str()
- string 字符串的每一个元素是字符char类型,把一个元素转成整数是 s[i]-'0' 而不是#include<cctype>的 stoi(string s) 函数!!!
- 对string 字符串的某个元素与一个字符进行比较的时候是是 s[i] == 'c' ,是单引号而不是双引号。
- 用个flag=0/1做判断比较简洁哦
-
一个vector赋值给另一个vector:给v2复制一份v1的数据------> v2=v1
-
map<int,vector<int>> xx ; 可以用
-
vector<int> a(n+1,1); 创建一个长为n+1的int型数组,并将数组中每一个位置的值都一次性赋值为1.
-
reverse(s.begin(),s.end()); 反转字符串
-
unordered_map比map快
-
求两个数的最大公因数和最小公倍数
int gcd(int a,int b){ //求a、b的最大公因数 return b == 0 ? a : gcd(b, a % b); } int gbs(int a,int b){ //求a、b的最小公倍数 int gys = gcd(a, b); //a,b的最大公因数 return (a > b) ? a*gys/b : b*gys/a; }
注意求最大公因数的辗转相余~
-
判断两个数是否异号,最好不要用 (a*b<0)? 来判断,因为a*b的值本身可能超过了题干要求的范围
-
s.find(xxx) == string::npos 如果在字符串 s 中找xxx,未找到,返回的是 string:npos!!!很实用
-
加权求和的意思是每一个元素与权值做乘法后把结果相加
-
transform(s.begin(), s.end(), s.begin(), ::toupper); 字符串转大写
transform(s.begin(), s.end(), s.begin(), ::tolower); 字符串转小写
-
注意有些字符串可以直接比较大小(ascii码),比如时间,id号等等~
-
printf的%0Nd格式自动为不足N位的整数在前面补上0 !!! (非常重要)
-
s.insert( i , N ,'0'); //在s的第 i 个位置插入 N 个 字符'0'
-
遇到输入链表节点的题,注意输入时可能会有游离的节点,需要遍历记录链表的长度
-
这些已经很多了,but,未完待续...