程序设计竞赛选拔赛(实训8).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
程序设计竞赛选拔赛(实训8)

2011程序设计竞赛选拔赛(实训8) 1、 排列数 由1个“1”,2个“2”,k个“3” (1≤k≤6)能组成多少个不同的排列? 输入k, 输出排列个数。 k=4, 输出: k=5, 输出: (1) 设计要点 注意到1个“1”,2个“2”,k个“3”组成k+3位数,首先通过k+2个10相乘计算k+3位数的起点b=10^(k+2),为枚举提供范围t(b—4*b-1)。 为了检测k+3位数t含有多少个数字1、2、3,每个k+3位整数t赋给d(以保持t不变),然后通过k+3次求余先后分离出t的k+3个数字c: if(c==1) f++, 统计整数t中数字1的个数f; if(c==2) g++, 统计整数t中数字2的个数g; if(c==3) h++, 统计整数t中数字3的个数h。 检测每一个k+3位整数:若f=1 and g=2 and h=k,则应用s进行统计。 最后输出所得排列个数s。 (2) 程序设计 // 排列数 #include stdio.h void main() { int c,f,g,h,i,j,k; long b,d,s,t; printf( 请输入数字3的个数k (1≤k≤6): ); scanf(%d,k); b=1; s=0; for(i=1;i=k+2;i++) b=b*10; // 计算k+3位数的起点 for(t=b;t=4*b-1;t++) // 枚举首位为3的k+3位数 { d=t;f=0;g=0;h=0; for(j=1;j=k+3;j++) { c=d%10; d=d/10; if(c==1) f++; // 统计数字1的个数 if(c==2) g++; // 统计数字2的个数 if(c==3) h++; // 统计数字3的个数 } if(f==1 g==2 h==k) s++; // 统计个数s } printf( s=%ld \n,s); } (3) 程序运行示例 请输入数字3的个数k (1≤k≤6): 4 s=105 请输入数字3的个数k (1≤k≤6): 5 s=168 (4) 拓广 若需求k=100时的排列数,如何求? 1) 注意到一排k个“3”的空位共k+1个。 这k+1个选2个空位共C(k+1,2)种组合,每一空位放置1个“2”。 这k+1个选1个空位共C(k+1,1)种组合,空位中放置2个“2”。 2) 注意到一排k个“3”与2个“2”的空位共k+3个。 这k+3个选1个空位共C(k+3,1)种组合,空位中放置1个“1”。 3) 因而得不同的排列数为: (C(k+1,2)+C(k+1,1))*C(k+3,1)=(k+1)*(k+2)*(k+3)/2 // 排列数 #include stdio.h void main() { int k;long s; printf( 请输入数字3的个数k: ); scanf(%d,k); s=(k+1)*(k+2)*(k+3)/2; printf( s=%ld \n,s); } 请输入数字3的个数k: 100 s=530553 (5) 实训1 计算由2个“1”、2个“2”、k个“3”的排列数。 计算由3个“1”、2个“2”、k个“3”的排列数。 测试数据: k=50 2、 求最值 设n为正整数,,式中各项符号为二正一负。求当n为多大时,s(n)最接近指定的正整数a? 输入a, 输出s(n)最接近a的n,s(n)。 (1) 输入1000,输出: (2) 输入2011,输出: 解: 一般地求当n为多大时,s(n)最接近正整数a?其中a从键盘输入a。 // s(n)=1+1/(1+1/2)-1/(1+1/2+1/3)+...+1/(1+1/2+...+1/n) #include stdio.h #includemath.h void main() { long a,n,n1; double m,ts,s,s1; printf( 请输入a: ); scanf(%d,a); n=0;ts=0;s=0;m=100000.0; while(sa+10) { n=n+1; ts=ts+(double)1/n; // ts为各项的分母 if(n%3==0) s=s-1/ts;

文档评论(0)

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

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

1亿VIP精品文档

相关文档