2014程序设计竞赛培训题解答.docVIP

  1. 1、本文档共50页,可阅读全部内容。
  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文档。上传文档
查看更多
2014程序设计竞赛培训题解答

2014程序设计竞赛培训题解答(1) 1. 统计n! 尾部零 试统计正整数n的阶乘n!=1×2×3×…×n尾部连续零的个数。 数据检测:n=2015;n解:以下试用两种不同的算法分别进行求解。 (1) 基本求积算法 1) 算法概要 注意到输入整数n规模可能较大,n! 尾部零的个数也就相应地多,设计a数组存储n!的各位数字,a[1]存储个位数字,a[2]存储十位数字,余类推。 试模拟整数竖式乘运算实施精确计算(详见第8章)。 首先通过常用对数累加和s=lg2+lg3+…+lgn确定n!的位数m=s+1,即a数组元素的个数。 设置2重循环,模拟整数竖式乘法实施各数组元素的累乘: 乘数k:k=2,3,…,n; 累乘积各位a[j]:j=1,2,…,m; 实施乘运算: t=a[j]*k+g; // 第j位乘k,g为进位数 a[j]=t%10; // 乘积t的个位数字存于本元素 g=t/10; // 乘积t的十位以上数字作为进位数 尾部连续零的个数统计: 从j=1时低位a[j]开始,a[j]=0时j++;作统计,直到a[j]!=0时结束。 2) 算法描述 // 计算n!(n10000)尾部零个数,c134 #include stdio.h #include math.h void main() { int j,k,m,n,a[40000]; long g,t;double s; printf( 请输入正整数n(n10000): ); scanf(%d,n); // 输入n s=0; for(k=2;k=n;k++) s+=log10(k); // 对数累加确定n!的位数m m=(int)s+1; for(k=1;k=m;k++) a[k]=0; // 数组清零 a[1]=1;g=0; for(k=2;k=n;k++) for(j=1;j=m;j++) { t=a[j]*k+g; // 数组累乘并进位 a[j]=t%10; g=t/10; } j=1; while(a[j]==0) j++; printf( %d! 尾部连续零共%d个。\n,n,j-1); // 输出n! 尾部零个数 } (2) 统计“5”因子设计 1) 设计思路 注意到n! 尾部连续零是n!中各相乘数2,3,…,n中“2”的因子与“5”的因子相乘所得,一个“2”的因子与一个“5”的因子得一个尾部“0”。 显然,n!中各个相乘数2,3,…,n中“2”的因子数远多于“5”的因子数,因而n! 尾部连续零的个数完全由n!中各个相乘数2,3,…,n中的“5”因子个数决定。 设n!中各个相乘数2,3,…,n中“5”的因子个数为s,显然有 其中[x]为不大于x的最大正整数,正整数m满足。 这里统计s只需设计一个简单的条件循环即可实现。 2) 算法描述 // 统计“5”因子设计,c135 #include stdio.h void main() { long n,s,t; printf( 请输入正整数n: ); scanf(%ld,n); // 输入n s=0;t=1; while(t=n) {t=t*5;s=s+n/t;} // 循环统计尾部连续0的个数 printf( %ld! 尾部连续零共%ld个。\n,n,s); // 输出结果 } (3) 数据检测与复杂度分析 请输入正整数n: 2015 2015! 尾部连续零共502个。 基本求积算法为双循环设计,循环频数为mn。注意到mn,把m换算为n, m数量级估算平均为n*logn,因而基本求积算法的时间复杂度为O(n2logn),空间复杂度为O(nlogn)。 统计“5”因子的设计大大简化了n! 尾部连续零个数的统计,算法的时间复杂度为O(logn),空间复杂度为O(1),显然大大优于基本求积算法。 统计“5”因子设计可大大拓展n的范围,例如输入n可 尾部连续零共5035500个,这一点基本求积算法因时间复杂度与空间复杂度太高而难以实现。 若案例稍加变通,需求n!结果所有数字中零的个数,基本求积算法(修改统计零的个数)可实现,而统

文档评论(0)

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

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

1亿VIP精品文档

相关文档