前言
在我写的C++程序员常犯的错误,这些坑你踩过吗?这篇文章的基础上继续补充的,这些都是我平常总结出来的知识点(其实更多的是从我同学那里的错误总结出来的),对于在考试时会有很大的帮助。所以感谢各位大佬的大力支持!!!
一、用double或sqrt()输出时会导致输出内容与样例不符
有时候当你用double或long double时,你用它输出一个比较大的数,它会给你输出这个数的科学计数法。
比如说你运行一下代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
double a = 1000000 ;
cout << a ;
return 0;
}
那么,结果不是1000000,而是转为科学计数法的1e+006。
想要输出1000000,就把它转为int型。
#include<bits/stdc++.h>
using namespace std;
int main(){
double a = 1000000 ;
cout << (int) a ;
return 0;
}
在很多题目中有用到开平方,也就是sqrt(),由于很多题目给的样例的开方都是整数,可是如果输出一个正整数的开方,比如
#include<bits/stdc++.h>
using namespace std;
int main(){
int a = 13 ;
cout << sqrt(13) ;
return 0;
}
运行后的结果是3.60555(四舍五入),可是有些题目只要整数。
所以
#include<bits/stdc++.h>
using namespace std;
int main(){
int a = 13 ;
cout << (int)sqrt(13) ;
return 0;
}
二、能贪就贪,不会用暴力,实在不行骗分。
1. 数据范围超出long long范围。
如果数据范围超出long long的范围,甚至还要大的时候,那么可以考虑使用字符串了。
用字符串就可以大大节省了时间(时间是宝贵的,一寸光阴一寸金......)
当然了,我们也可以减少循环次数以达到效果。
说到贪心,它有时候需要排序,但考试的题目大都是是不排序的。要排序那也太容易AC了
2. 有些题目的数据大,其实是个数学问题。
有题目会有些复杂,很多人看不出来其中的奥妙,只会暴力或骗分。只要多开几组数据,也许就会发现它的公式或者是数学规律。
你直接套进去用就可以了,但是会花费一点时间,所以平常练习中就要多做这一类的题目,比赛时就很容易知道思路。
3. 真的不会,骗分。
(我有个同学不知道,我就再讲一遍,唉......)
题目下面总会有数据范围嘛,按照给的范围,思考出不同的情况,如果有部分分数据范围较小,就直接暴力呗,要不然就找数学公式或规律。
三、求区间的,用前缀和或差分
有题目你,给你一个序列a,再给个l和r,要求出他们直间......(按题目要求)。按普通的一个个枚举,倒不会AC。
那么就要用到前缀和或着差分。
关于前缀和和差分我就不多讲了,有时间的可以去练习以下的题目。
四、正难则反
有些题目,你按照他们的思路,则会感到很绕。那么你就可以从另一个角度来思考。
比如说有道题要你判断a到b之间的数的二进制只有一个0的数有多少个,按照普通思路,我们要把这个数转为二进制,再以此判断,有点麻烦。那我们就可以从另外一个角度来思考。
1.枚举二进制的长度;
2.枚举对应长度下的0的位置;
3.二进制转十进制,只要再a和b之间,即可。
结束语
这就是我总结的一些常犯错误,下次还会更新,感谢支持与鼓励!!!
有不懂的或没讲清楚可以在评论区里留言~~