XXXX程序设计竞赛选拔赛(实训8)_第1页
XXXX程序设计竞赛选拔赛(实训8)_第2页
XXXX程序设计竞赛选拔赛(实训8)_第3页
XXXX程序设计竞赛选拔赛(实训8)_第4页
XXXX程序设计竞赛选拔赛(实训8)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、20111程序设设计竞赛赛选拔赛赛(实训训8)1、 排排列数由1个“1”,2个个“2”,k个个“3”(1k6)能组成成多少个个不同的的排列? 输入入k, 输出排排列个数数。k=4, 输输出:k=5, 输输出:(1) 设计计要点注意到11个“1”,2个个“2”,k个个“3”组成kk+3位位数,首首先通过过k+22个100相乘计算算k+33位数的的起点bb=100(kk+2),为枚枚举提供供范围tt(b4*b-11)。为了检测测k+33位数tt含有多多少个数数字1、2、33,每个个k+33位整数数t赋给给d(以以保持tt不变),然后后通过kk+3次次求余先先后分离离出t的的k+33个数字字c:if

2、(cc=11) ff+, 统计计整数tt中数字字1的个数数f;if(cc=22) gg+, 统计计整数tt中数字字2的个数数g;if(cc=33) h+, 统计计整数tt中数字字3的个数数h。检测每一一个k+3位整整数:若若f=1 andd g=2 aand h=kk,则应应用s进进行统计计。最后输出出所得排排列个数数s。(2) 程序序设计/ 排排列数#inccludde voidd maain() innt cc,f,g,hh,i,j,kk; loong b,dd,s,t; prrinttf( 请请输入数数字3的的个数kk (11k6): ); sscannf(%d,&kk); b=1; s

3、=00; foor(ii=1;i=k+22;i+) b=bb*100; / 计算kk+3位位数的起起点 foor(tt=b;t=4*bb-1;t+) / 枚举首首位为33的k+3位数数 d=tt;f=0;gg=0;h=00; forr(j=1;jj=kk+3;j+) cc=d%10; d=d/110;if(cc=11) ff+; / 统统计数字字1的个个数if(cc=22) gg+; / 统统计数字字2的个个数if(cc=33) hh+; / 统统计数字字3的个个数 iff(f=1 & g=2 & hh=kk) ss+; / 统统计个数数s prrinttf( s=%ld n,s); (3)

4、程序运运行示例例请输入数数字3的的个数kk (11k6): 4s=1005 请输入入数字33的个数数k (1k6): 5 s=1688(4) 拓广 若需需求k=1000时的排排列数,如如何求?1) 注注意到一一排k个个“3”的空位位共k+1个。这k+11个选22个空位位共C(k+11,2)种组合合,每一一空位放放置1个个“2”。这k+11个选11个空位位共C(k+11,1)种组合合,空位位中放置置2个“2”。2) 注注意到一一排k个个“3”与2个个“2”的空位位共k+3个。这k+33个选11个空位位共C(k+33,1)种组合合,空位位中放置置1个“1”。3) 因因而得不不同的排排列数为为:(C

5、(kk+1,2)+C(kk+1,1)*C(k+33,1)=(kk+1)*(kk+2)*(kk+3)/2/ 排排列数#inccludde voidd maain() innt kk;loong s; prrinttf( 请请输入数数字3的的个数kk: ); scaanf(%dd,&k); s=(k+1)*(k+2)*(k+3)/2; priintff( ss=%lld n,s); 请输入数数字3的的个数kk: 1100 s=53005533(5) 实训训1计算由22个“1”、2个个“2”、k个个“3”的排列列数。计算由33个“1”、2个个“2”、k个个“3”的排列列数。测试数据据: kk=500

6、2、 求求最值设n为正正整数,式中各项符号为二正一负。求当n为多大时,s(n)最接近指定的正整数a?输入a, 输出出s(nn)最接接近a的的n,ss(n)。(1) 输入110000,输出出:(2) 输入220111,输出出:解: 一一般地求求当n为为多大时时,s(n)最最接近正正整数aa?其中中a从键键盘输入入a。/ ss(n)=1+1/(1+11/2)-1/(1+1/22+1/3)+.+1/(1+1/22+.+11/n)#inccludde #inccluddevoidd maain() loong a,nn,n11; dooublle mm,tss,s,s1; prrinttf( 请请输入

7、aa: ); sccanff(%d,&a); n=0;tts=00;s=0;mm=10000000.00; whhilee(sa+110) n=nn+1; ts=ts+(dooublle)11/n; / tss为各项项的分母母if(n%33=00) s=ss-1/ts; / 求代代数和sselsse s=ss+1/ts; if(fabbs(ss-a)zz。为避避免重复复,不妨妨设xyzz。在指定区区间aa,b上根据据x,yy,z的的大小关关系设置置循环:z从aa至b-2,yy从z+1至bb-1,x从yy+1至至b。对每一组组x,yy,z,如果直直接应用用条件式式 1/(x*x)+1/(y*yy

8、)=11/(zz*z)作判别,因因分数计计算的不不可避免免的误差差,有可可能把一一些成立立的倒立立勾股数数组解遗遗失,即造成成遗漏。注意到上上述分数数条件式式作通分分整理得得到的下下面的正正整数条条件式 z*z*(x*xx+y*y)=x*xx*y*y程序中为为防止发发生解的的遗漏,应应用上述述整数条条件作判判别是适适宜的。(2) 求区间间内倒立立勾股数数程序设设计/ 求指定定区间内内倒立勾勾股数组组 #inccludde #inccludde voidd maain()intt a,b,nn; llongg x,y,zz; priintff( 求指定定区间a,bb内倒倒立的勾勾股数组组.);

9、priintff(n 请请输入区区间aa,b的上下下限a,b: ); scaanf(%dd,%dd,&a,&b); priintff(n 区区间%d,%d中中倒立的的勾股数数组有:n,a,b); n=00; forr(z=a;zz=bb-2;z+) forr(y=z+11;y=b-1;yy+) forr(x=y+11;x=b;x+) if(z*zz*(xx*x+y*yy)=x*xx*y*y) / 满足足倒立勾勾股数条条件时输输出 n+; prrinttf( 1/%ldd2+1/%ld2=11/%lld22 nn,xx,y,z); priintff(共共%d组组勾股数数.,n); (3) 程序运

10、运行示例例区间330,1100中倒立立的勾股股数组有有: 1/66022+1/452=11/3662 1/88022+1/602=11/4882 1/11002+11/7552=1/66022共3组勾勾股数.区间1100,2000中倒倒立的勾勾股数组组有: 1/11802+11/133522=1/10882 1/22002+11/155022=1/12002共2组勾勾股数.4、 双双和数组组寻求6个个互不相相等的正正整数aa,b,c,dd,e,f并分成(a,bb,c)与(dd,e,f)两两个组,若若这两组组数具有有以下两两个相等等特性:则把数组组(a,b,cc)与(d,ee,f)称为双双和数组

11、组(约定定abbc,deef,add)。1) 设设a+bb+c=d+ee+f=s, 存在双双和数组组, ss至少为为多大?2) 当当s=998时有有多少个个不同的的双和数数组?(1) 求解解要点从键盘输输入整数数s,因因6个不不同正整整数之和和至少为为21,即即输入整整数s11。设置a,b与dd,e循循环。注注意到aa+b+c=ss,且aaba,因因而d起起点为aa+1。把比较倒倒数和相相等1/a+1/b+1/cc1/d+1/ee+1/ff转化为为比较整整数相等等d*e*f*(b*cc+c*a+aa*b)=a*bb*c*(e*f+ff*d+d*ee) (*)若上式不不成立,即即倒数和和不相等等

12、,则返返回。同时注意意到两个个3元组组中若部部分相同同部分不不同,不不能有倒倒数和相相等,因因而可省省略排除除以上66个正整整数中是是否存在在相等的的检测。若式(*)成立立,打印印输出和和为s的的双和数数组,并并用x统统计解的的个数。(2) C程程序设计计/ 双双和数组组探索 #inccludde#inccluddevoidd maain()intt a,b,cc,d,e,ff,x,s;for(s=221;ss=1100;s+)priintff( s=%d: nn,ss); x=0;for(a=11;a=(ss-3)/3;a+)for(b=aa+1;b=(s-a-11)/22;b+)for(d

13、=aa+1;d=(s-3)/3;dd+)for(e=dd+1;e=(s-d-11)/22;e+)c=ss-a-b; f=ss-d-e;if(aa*b*c*(e*ff+f*d+dd*e)!=dd*e*f*(b*cc+c*a+aa*b)conttinuue; / 排排除倒数数和不相相等 x+;prinntf(%33d: (%22d,%2d,%2dd) ,xx,a,b,cc);prinntf(%2d,%2dd,%22d)n,d,ee,f);if(xx=00) pprinntf( 无解!n);(3) 程序序运行结结果与讨讨论s=266:1: ( 4,10,12) ( 5, 6,15) s=988:1:

14、 ( 2,36,60) ( 3, 5,90) 2: ( 7,28,63) ( 8,18,72) 3: ( 7,35,56) ( 8,20,70) 4: (10,33,55) (12,20,66) (4) 实训33寻求6个个互不相相等的正正整数aa,b,c,dd,e,f并分成(a,bb,c)与(dd,e,f)两两个组,若若这两组组数具有有以下两两个相等等特性:则把数组组(a,b,cc)与(d,ee,f)称为和和积数组(约定aabc,ddef,aad)。1) 设设a+bb+c=d+ee+f=s, 存在和和积数组, s至至少为多多大?2) 当当s=889时有多多少个不不同的和和积数组?5、 mm位完

15、美平方方数用0,11,2,.,9能能组成多多少个没没有重复复数字的的m(11m10)位平方方数? 输入m,输出没没有重复复数字的的m位平平方数的的个数,并并输出其其中最大大的。m=7, 输出出:m=100, 输输出:/ 用用0,11,2,.,9组组成没有有重复数数字的mm位平方方数 #inccludde #inccludde voidd maain()intt k,m,nn,t,f110; doubble a,bb,c,d,ww,x,a1,d1;prinntf( 请确定定整数mm: ); scaanf(%dd,&m);x=1.0;for(k=22;k=m;k+) xx=x*10; / 确定mm

16、位数的的起点xxn=0;b=(iint)poww(x,0.55);cc=poow(110*xx-1,0.55);for(a=bb+1;a=c;aa+)d=aa*a; w=d; / 确确保d为为m位平平方数 forr(k=0;kk00) tt=(iint)fmood(ww,100);fft=ft+1;ww=flloorr(w/10); forr(t=0,kk=0;k1) tt=1; brreakk; / 测试试平方数数是否有有重复数数字 if(t=0 ) / 测测试平方方数中没没有重复复数字 nn+;d1=d;aa1=aa;prinntf( 共可组组成%dd个没有有重复数数字的%d位平平方数.,

17、nn,m);prinntf( 其其中最大大的为:%.00f=%.0ff2 n,d11,a11); 请确定整整数m: 7共可组成成1233个没有有重复数数字的77位平方方数. 其中最最大的为为:988721164=3144222请确定整整数m: 100共可组成成87个个没有重重复数字字的100位平方方数. 其中最最大的为为:9881400723356=9900662实训4:用0,11,2,.,9能能组成没没有重复复数字的的m(11m10)位平方方数的个个数为ss(m).问: (11) 求求s(110),即即求出没有重重复数字字的100位平方方数的个个数。(2)当当m为多多大时,没没有重复复数字的

18、的m位平方方数个数数s(mm)最大?6、 最最小011串积程序设计计爱好者者A,BB进行计计算游戏戏:B任给一一个正整整数b,A寻求另另一个整整数a, 使aa 与bb的积最最小且全全为0与与1组成的的数。例如,BB给出整整数244,A寻寻求整数数a:446255,使得得a*bb的最小小01串串积为:11110000输入b,输出aa与最小小01串串积。b=244, 输输出:b=20011, 输出出:(1)对对a枚举举考虑到aa与积dd可能大大于100位,用双精精度型。对a递增增枚举,检测积积d=aa*b是是否为001串/ 01串串积对aa枚举 #inccludde #inccludde void

19、d maain() llongg c,t;ddoubble a,bb,d,j; pprinntf( B给出出整数bb: ); scaanf(%llf,&b); aa=1; wwhille(11) aa+;d=aa*b; jj=d;t=00; wwhille(jj0) / 分离离积的各各个数字字c c=(innt)ffmodd(j,10); jj=flloorr(j/10);if(cc1) tt=1;breeak; / 检测是是否含有有0,11以外的的数字if(tt=00) prrinttf( AA寻求整整数a: %.0f:n,a);prinntf( a*bb的最小小01串串积为: %.0fn,

20、d);breaak;B给出整整数b: 733 A寻求求整数aa: 1137: a*bb的最小小01串串积为: 1000011B给出整整数b: 544 A寻求求整数aa: 220399094465: a*bb的最小小01串串积为: 111011111111100(2) 二进制制枚举,应用余数判别。1) 注注意到001串积为十十进制数数,应用用求余运运算“%”可分别别求得个个位“1”,十位位“1”,分别别除以已已给b的余数数,存放放在c数数组中:c(11)为1,cc(2)为100除以bb的余数数,c(3)为为1000除以bb的余数数,。2) 要要从小到到大搜索索01串串,不重重复也不不遗漏,从从中

21、找出出最小的的能被bb整除001串积。为此此,设置置k从11开始递递增,把把k转化化为二进进制,就就得到所所需要的的这些串串。不过过,这时时每个串串不再看看作二进进制数,而而要看作作十进制制数。3) 在在某一kk转化为为二进制制数过程程中,每每转化一一位a(i)(0或1),求求出该位位除以bb的余数数a(ii)*cc(i),通过过累加求求和得kk转化的的整个二二进制数数除以bb的余数数s。4) 判判别余数数s 是否否被b整除:若s%b=00, 即即找到所所求最小小的011串积。a 从从高位开开始除以以b的商商存储在在d数组组,实施施整数除除法运算算:x=e*10+ajj;/ ee为上轮轮余数,xx为被除除数 dj=x/b; / d为为a 从从高位开开始除以以b的商商 e=x%b;/ ee为试商商余数 去掉d数数组的高高位“0”后,输输出d即即为所寻寻求的数数。最后从高高位开始始打印aa数组,即即为011串积。(3) 程序设设计/ 01串串积二进进制枚举举#inccluddevoidd maain() iint b,ee,i,j,tt,x,a220000,dd20000,c20000; llongg k,s; ppr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论