C++程序员常犯的错误,这些坑你踩过吗?-(二)

前言

        在我写的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。

        那么就要用到前缀和或着差分。

        关于前缀和和差分我就不多讲了,有时间的可以去练习以下的题目。

        P8218 【深进1.例1】求区间和

        P1314  [NOIP2011 提高组] 聪明的质监员

        P1955  [NOI2015] 程序自动分析

四、正难则反

        有些题目,你按照他们的思路,则会感到很绕。那么你就可以从另一个角度来思考。

        比如说有道题要你判断a到b之间的数的二进制只有一个0的数有多少个,按照普通思路,我们要把这个数转为二进制,再以此判断,有点麻烦。那我们就可以从另外一个角度来思考。

        1.枚举二进制的长度;

        2.枚举对应长度下的0的位置;

        3.二进制转十进制,只要再a和b之间,即可。

结束语

        这就是我总结的一些常犯错误,下次还会更新,感谢支持与鼓励!!!

        有不懂的或没讲清楚可以在评论区里留言~~

  • 40
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 40
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值