2022年CSP-J第二轮C++真题源码解析1.docxVIP

2022年CSP-J第二轮C++真题源码解析1.docx

此“教育”领域文档为创作者个人分享资料,不作为权威性指导和指引,仅供参考
  1. 1、本文档共8页,可阅读全部内容。
  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文档。上传文档
查看更多
包含真题、源码和算法分析(功能实现、时间复杂度和空间复杂度)。

2022年CSP-J第二轮真题源码解析 个人解析,非评分标准答案。 1. T1?[ CSP-J?2022]乘方 【题目描述】 小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a和 b,求ab的值是多少。 ab即b个a相乘的值,例如23即为3个2相乘,结果为2×2×2=8。 “简单!”小文心想,同时很快就写出了一份程序,可是测试时却出现了错误。小文很快意识到,她的程序里的变量都是 int类型的。在大多数机器上,int类型能表示的最大数为231-1,因此只要计算结果超过这个数,她的程序就会出现错误。 由于小文刚刚学会编程,她担心使用int计算会出现问题。因此她希望你在ab的值超过 109时,输出一个-1进行警示,否则就输出正确的ab的值。然而小文还是不知道怎么实现这份程序,因此她想请你帮忙。 【输入格式】 输入共一行,两个正整数a,b。 【输出格式】 输出共一行,如果ab的值不超过109,则输出ab的值,否则输出-1。 【输入输出样例】 输入#1 10 9 输出#1 1000000000 输入#2 23333 66666 输出#2 -1 【说明/提示】 对于10%的数据,保证b=1。 对于30%的数据,保证b≤2。 对于60%的数据,保证b≤30,ab≤1018。 对于100%的数据,保证1≤a,b≤109。 参考源码: #includebits/stdc++.h using?namespace?std; #define?ll?long?long?int const?ll?c?=?1e9; ll?f(ll?a,?ll?b)?{ ????ll?ret?=?1; ????if?(a==1)?return?1; ????for?(ll?i?=?1;?i?=?b;?i++)?{ ????????ret?*=?a; ????????if?(ret??c)?{ ????????????ret?=?-1; ????????????break; ????????} ????} ????return?ret; } int?main()?{ ????ll?a,?b; ????cin??a??b; ????cout??f(a,?b)??endl; ????return?0; } 算法思路: 这道题如何从算法的角度来看,计算ab直接累乘即可:b个a相乘,或者直接用快速幂算法来计算。但是这题要考查的核心不是时间复杂度,而是参数范围和返回值的范围问题(题目中已经提示了)。 先分析一下题目会不会出现TLE(Time Limit Exceeded)问题。ab的值不超过109,int型变量的最大值为231-1(231-1109),也就是说当a≥2,最多循环32次就超过了int型的范围,当然也超过了109范围。所以无需考虑时间复杂度,自然也就不需要采用快速幂算法。 下面讨论越界问题。可以在每次累乘的时间判断结果是否大于109,大于则返回-1,结束循环。这里面有一个问题需要考虑:假设n次累乘的结果小于109,n+1次累乘的结果大概在什么范围内?由于a≤109,n+1次累乘的结果(中间结果)有可能int越界,但是不可能long long int越界(109×109),所以需要将相关的变量设置为long long int,而不能用int型,防止出现整数上溢出问题。在上面程序中,将(a,b,ret)三个变量设置为long long int,至于为什么要将a和b也设置为long long int(b可以不设置),具体案例可看下面测试代码: #include?iostream using?namespace?std; int?main(){ ????long?long?int?a=1e+9; ????long?long?int?b=1e+9; ????//不溢出 ????couta*bendl; ????int?a1=1e+9; ????int?b1=1e+9; ????//溢出 ????couta1*b1endl; ????long?long?int?a2=1e+9; ????int?b2=1e+9; ????int?ret1=a2*b2; ????long?long?int?ret2=a2*b2; ????//不溢出 ????couta2*b2endl; ????//溢出 ????coutret1endl; ????//不溢出 ????coutret2endl; ????return?0; } 运行截图如下: c=a×b在计算时,先计算后赋值(没有c就不赋值)。左边计算结果的范围取决于a和b的最大范围,例如上例中a为long long int,b为int,则计算结果的最大范围就是long long int;如果计算结果没有溢出,但是

您可能关注的文档

文档评论(0)

比特文档 + 关注
实名认证
服务提供商

专注于计算机专业的毕业论文辅导,包括:选题、文献搜集、论文结构、算法、程序、毕业论文答辩等; 专注于计算机专业的期刊论文辅导; 专注于计算机专业教学课件、教案和考试试题的开发。

1亿VIP精品文档

相关文档