输出格式
补位
需要注意题目的输出格式,可能不会直说,若是00001时,注意要在高位补0
1 | printf("%05d",a);//以0补充 |
科学计数法
用cout输出大数会产生科学计数法
iomanip——定义IO流输出输入格式的头文件
1 | cout << fixed << setprecision(0) << 数据 << endl; |
取余
要求对结果的大数取模时,若最后再取模,可能在计算过程中越界,如:
1 | while(i<n){ |
存在公式
$$
(a\pm b)%p=(a%p\pm b%p)%p\
(ab)%m=(a%mb%m)%m\
a^b%m=(a%m)^b%m
$$
因此,可以在循环中取模
1 | while(i<n){ |
时间超限
利用cout和cin在数据量大时会直接超时,需使用**printf()和scanf()**。
1 | char a[10]; |
只能用cin和cout进行输入输出,可利用c_str()转换为char数组。
1 | string s; |
double精度问题
double可能会导致误差,如double*int和int*double计算所得答案不同
1 | //1104 Sum of Number Segments |
可以利用long long 型,对浮点数先乘1000后除1000的方法避免误差( 假设测试样例的小数在三位以内,四五六位经过多次累加进位后依然可能会引起精度问题)
1 | long long ans = 0; |
1106 Lowest Price in Supply Chain中,需计算叶子节点的深度,利用复利法计算结果
若递归时,参数设为double,会导致错误点二错误
1 | double rate; |
若递归时,参数设置为int记录层数,最后再计算,成功AC
1 | void DFS(int root,int layer) { |
cmath
引入#include<cmath>
以e为底:log(exp(n))
以10为底:log10(n)
以m为底:log(n)/log(m)
map和哈希表
将学生名字abc9(由三个字母和一个数字组成)对应到表中,利用map<string,int>可能导致存储过大,提示段错误,因此可考虑hash表的形式。
1 | map<string,int>clas; |
可通过map.count()函数判断某键是否存在。
1 | clas.count("abc9");//1 |
1 | //将字母和数字利用ASCII表映射到数字 |
转变后姓名对应着索引,可知索引最大是26*26*26*10,创建数组或vector时需注意大小const int maxn=200000。
静态链表
当结点的地址是比较小的整数(如5位数的地址)时,可采用静态链表,相比动态链表更加方便。
1 | struct Node { |