编程新手会遇到问题.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
貌似新人们总会遇到几个问题,提一下吧。 1. 64Bit整型的问题 2. 大数组RE的问题 3. cin/cout的TLE危险 4. scanf的\n遗留问题以及gets的RE问题 5. 精度问题 6. 其它还有一些建议 -- 1. 64Bit整型的问题 这个东西比较纠结阿。一般来说 在VC下面,定义的时候要用__int64 用g++/gcc的时候,则应该用long long定义 在Windows下面,输入输出的时候要用%I64d这个格式 在类Unix(包括Solaris/Linux等)下面,输入输出的时候要用%lld这个格式 对于各类OJ,不妨自己在A+B这道题上试试 参加比赛的时候,务必向工作人员或者judge问清楚编译环境 ——包括操作系统和编译器。 2. 大数组RE的问题 emingCup的时候就有队伍遇到这个问题 自己运行的时候都RE还交过来。 这个涉及到编译器对不同类型变量的内存分配规则。 在C/C++中 对于在函数内定义的变量(包括main()函数) 都是在程序的栈空间内分配的(这个空间相对有限) 如果定义一个内存使用量达到MB级别的数组 一般就会Stack Overflow,RE了。 所以遇到大数组的时候建议大家都定义成全局变量 这样就可以在编译的时候就为它们分配好足够的空间。 更具体的可以参见luoxi同学的这篇日志。 HYPERLINK /luoxi0209/blog/item/50364c39b1c2622597ddd8b0.html \t _blank /luoxi0209/blog/item/50364c39b1c2622597ddd8b0.html 另外,想起snoopy大牛的建议,如果你的算法递归稍会微深一点,那就考虑优化,或者写非递归的吧。 3. cin/cout的TLE危险 C++中cin/cout这两个预定义好的变量内部都有个缓冲区 对于实际使用是非常有好处的 但是不适合用来做acm:它们常常会导致TLE 原因大概是没有及时把它们的缓冲区输出吧。 特别要注意的是不止cin/cout 其它所有的C++流都可能有缓冲区 所以做题目的时候,特别是有大量I/O的题目 尽量使用scanf和printf (它们的格式化输出功能非常好)。 对于字符串,string确实很好用,但是只能用cin输入 必要的时候,变通的方法是 定义一个比较大的char数组,scanf到这个数组,然后再赋给string char a[1024]; string b; scanf(%s, a); b = string(a); 输出的时候就: printf(%s, b.c_str()); 4. scanf的\n遗留问题以及gets的RE问题 有些题目的输入格式很BT阿 scanf默认用空白字符(包括空格,tab,回车,换行)作为分隔符 在输入完一个数据以后,接下来的空白符不会被处理 会继续留在系统的输入缓冲区(特别是\n) 所以如果这个时候要输入一个字符,很可能的就是输入的是\n 这时候可以用一个getchar()来处理这个\n。 有时候需要读入完整的一行,因为scanf的默认分隔符问题 所以有时候需要换个读入方式 而gets的RE问题是这样的 gets遇到\n或者EOF才会结束 所以可能就会导致数组越界错误 因此尽量不要使用, 推荐使用scanf(%1024[^\n], a) 或者 fgets(a, 1024, stdin); 限制输入的字符数。 5. 精度问题 对于float/double的比较,通常可能会有舍入误差 (比如0.1这个东西在IEEE754标准下永远不可能精确存储) 导致本来应该相等的不相等,所以建议这样 先定义一个常量,比如精度在10^-9这个额度(要根据具体问题判断这个额度!) #define EPS (1e-9) 然后用这样一个比较函数: int cmpDouble(double a, double b){ ????if(fabs(a - b) EPS) return 0; // a == b ????else if(a - b 0) return 1; // a b ????else return -1; // a b } 对于float/double的取整也很有技巧: floor和ceil不一定能给你你想要的结果(why?) 对于一个double类型的a,想想这些表达式的意义: (提示:取(?)整,四舍五入) (int)(a + EPS) (int)(a + EPS + 0.5) 以上对于正数成立,对于负数呢?最好还是自己想想,嗯。 其它还有一些建议,比如 ~ 定义数组的时候开大些 ??比如题目告诉最多5000个数据,那就开到5010或者更多一些吧 ~ 不要太依赖vc的调试功

文档评论(0)

sy78219 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档