- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
⑶两个整数数组相乘(a←a*n,a和n为为整数数组) 我们按照由高位到底位的顺序,将a数组的每一个元素与n相乘。当计算到a[j]*n时,根据乘法规则,a[j-1], …,a[0]不变,a[j]为a[j]为a[j]与n[0]的乘积,a[j+k]加上a[j]*n[k]的乘积(k=ln-1,ln-2, …,1),然后按照由底位到高位的顺序处理进位。最后,如果a[la-1]*n有进位,则乘积a的有效位数为la+ln;否则a的有效位数为la+ln-1。 for j←la-1 downto 0 do {a1←a*n} for k←ln-1 downto 0 do inc(a1[j+k-1],a[j]*n[k]); a←a1; l←0; {进位初始化} for j←0 to la+ln-1 do begin {按照由底位到高位的顺序处理进位} inc(l,a[j]);{计算经过进位后的第j位} a[j] ←l mod 10000; {将第j位规整为10000进制数} l←l div 10000;{计算进位} end;{for} if (a[la+ln-1]0 ) then inc(la,ln) {修改有效位数} else inc(la,ln-1); 彩票 现今,社会上流行着各种各样的福利彩票,彩票已经融入到了人们的日常生活之中。彩票之所以能吸引那么多的人们,玩法多是一大原因。其中有一类是从前N个自然数中选出M个(不计顺序)不同的号码,如果这M个号码与摇奖时摇出的M个中奖号码完全相符,那么就中了头奖。如现在已经有的:30选7,35选7,36选7,37选7…… 随着时间的推移,越来越多的人不满足于原来的玩法。为了追求更大的刺激,可供选择的号码和每注的号码个数越来越大,88选8,518选18,8888选68等等应运而生。但是,由此也衍生出了许多麻烦。由于数字越来越大,福彩中心的工作人员们已经无法用一般的计数器精确地计算出每一种彩票中头奖的概率。现在请你帮助他们,编一个程序:对于每一种玩法,能够快速准确地计算出中头奖概率的倒数。 输入输出:输入文件名为Lottery.in。它包含两行:第一行是正整数N(M?N1040);第二行是正整数M(0M?1000)。输出文件名为Lottery.out。它仅包含一个数,表示在“N选M”的玩法中,中头奖的概率的倒数。输出文件中不应有多余的空格。 样例: Lottery.in 5 2 Lottery.out 10 从N个数中(不计顺序)取出M个不同的数的取法共有C(N, M)种。这里C(N, M)表示组合数。因此,要使摇出的中奖号码与所选的号码完全相同,概率只有1 / C(N, M)。所以我们要求的值即为C(N, M)。根据组合数的计算公式: 我们可以直接地求解。但是由于题目中的N可能很大,所以我们必须要用到高精度计算。而在高精度计算中,运行的时间与参与运算的数的大小有直接的关系。所以,我们要使运算的中间结果尽可能地小。如果我们先把N~(N-M+1)这M个连续的自然数乘起来,再依次除以1~M就是一种不太明智的选择。 1.我们可以先乘N除1,然后乘(N-1)除2,再乘(N-2)除3,……最后乘(N-M+1)除M。因为连续的K个自然数的积一定能被K!整除,所以在这一过程中不会出现除不尽的情况。同时也使得中间结果比较小,从而提高了程序运行的速度。 2.用一个Longint记录4位数字。数组相当于一个10000进制的数,其中每一个数都是10000进制下的一位数。 readln(st); readln(m); k:=length(st);{取得数串st的长度} for i:=0 to k-1 do begin {把N保存到数组n中} j:=(k-i+3) div 4-1;n[j]:=n[j]*10+ord(st[i+1])-48; end;{for} ln:=(k+3) div 4; a[0]:=1 ;la:=1; {初始化数组a} for i:=1 to m do begin {计算组合数C(n,m)} for j:=la-1 downto 0 do begin {将n乘到a上} for k:=ln-1 downto 1 do inc(a[j+k],a[j]*n[k]); a[j]:=a[j]*n[0]; end;{for} l:=0; for j:=0 to la+ln-1 do begin {处理进位} inc(l,a[j
文档评论(0)