欢迎来到天天文库
浏览记录
ID:6597284
大小:29.00 KB
页数:4页
时间:2018-01-19
《编程新手会遇到的问题》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、貌似新人们总会遇到几个问题,提一下吧。1.64Bit整型的问题2.大数组RE的问题3.cin/cout的TLE危险4.scanf的遗留问题以及gets的RE问题5.精度问题6.其它还有一些建议--1.64Bit整型的问题这个东西比较纠结阿。一般来说在VC下面,定义的时候要用__int64用g++/gcc的时候,则应该用longlong定义在Windows下面,输入输出的时候要用%I64d这个格式在类Unix(包括Solaris/Linux等)下面,输入输出的时候要用%lld这个格式对于各类OJ,不妨自己在A+B这道题上试试参加比赛的时候,务必向工作人员
2、或者judge问清楚编译环境——包括操作系统和编译器。2.大数组RE的问题emingCup的时候就有队伍遇到这个问题自己运行的时候都RE还交过来。这个涉及到编译器对不同类型变量的内存分配规则。在C/C++中对于在函数内定义的变量(包括main()函数)都是在程序的栈空间内分配的(这个空间相对有限)如果定义一个内存使用量达到MB级别的数组一般就会StackOverflow,RE了。所以遇到大数组的时候建议大家都定义成全局变量这样就可以在编译的时候就为它们分配好足够的空间。更具体的可以参见luoxi同学的这篇日志。http://hi.baidu.com/luo
3、xi0209/blog/item/50364c39b1c2622597ddd8b0.html另外,想起snoopy大牛的建议,如果你的算法递归稍会微深一点,那就考虑优化,或者写非递归的吧。3.cin/cout的TLE危险C++中cin/cout这两个预定义好的变量内部都有个缓冲区对于实际使用是非常有好处的但是不适合用来做acm:它们常常会导致TLE原因大概是没有及时把它们的缓冲区输出吧。特别要注意的是不止cin/cout其它所有的C++流都可能有缓冲区所以做题目的时候,特别是有大量I/O的题目尽量使用scanf和printf(它们的格式化输出功能非常好)。
4、对于字符串,string确实很好用,但是只能用cin输入必要的时候,变通的方法是定义一个比较大的char数组,scanf到这个数组,然后再赋给stringchara[1024];stringb;scanf("%s",a);b=string(a);输出的时候就:printf("%s",b.c_str());4.scanf的遗留问题以及gets的RE问题有些题目的输入格式很BT阿scanf默认用空白字符(包括空格,tab,回车,换行)作为分隔符在输入完一个数据以后,接下来的空白符不会被处理会继续留在系统的输入缓冲区(特别是)所以如果这个时候要输入一个字
5、符,很可能的就是输入的是这时候可以用一个getchar()来处理这个。有时候需要读入完整的一行,因为scanf的默认分隔符问题所以有时候需要换个读入方式而gets的RE问题是这样的gets遇到或者EOF才会结束所以可能就会导致数组越界错误因此尽量不要使用,推荐使用scanf("%1024[^]",a)或者fgets(a,1024,stdin);限制输入的字符数。5.精度问题对于float/double的比较,通常可能会有舍入误差(比如0.1这个东西在IEEE754标准下永远不可能精确存储)导致本来应该相等的不相等,所以建议这样先定义一个常量
6、,比如精度在10^-9这个额度(要根据具体问题判断这个额度!)#defineEPS(1e-9)然后用这样一个比较函数:intcmpDouble(doublea,doubleb){ if(fabs(a-b)0)return1;//a>b elsereturn-1;//a7、(int)(a+EPS+0.5)以上对于正数成立,对于负数呢?最好还是自己想想,嗯。其它还有一些建议,比如~定义数组的时候开大些 比如题目告诉最多5000个数据,那就开到5010或者更多一些吧~不要太依赖vc的调试功能吧 比赛的时候大多是没这个条件的,学习gdb,或者用printf什么的自己动手调。~学习vim吧,用熟了它你才会知道什么叫做编辑器。~学习STL吧!最起码一些简单的算法和容器得会使阿,不然你很吃亏的。那些代码都是最牛的那些人写的东西,效率绝对不会比你写的代码差——而且还省大量coding的时间。举个例子说,对于inta[5]={3,4,58、,2,7};sort(a,a+5);以后a就是升序了。如果要降序,
7、(int)(a+EPS+0.5)以上对于正数成立,对于负数呢?最好还是自己想想,嗯。其它还有一些建议,比如~定义数组的时候开大些 比如题目告诉最多5000个数据,那就开到5010或者更多一些吧~不要太依赖vc的调试功能吧 比赛的时候大多是没这个条件的,学习gdb,或者用printf什么的自己动手调。~学习vim吧,用熟了它你才会知道什么叫做编辑器。~学习STL吧!最起码一些简单的算法和容器得会使阿,不然你很吃亏的。那些代码都是最牛的那些人写的东西,效率绝对不会比你写的代码差——而且还省大量coding的时间。举个例子说,对于inta[5]={3,4,5
8、,2,7};sort(a,a+5);以后a就是升序了。如果要降序,
此文档下载收益归作者所有