网站大量收购独家精品文档,联系QQ:2885784924

题目描述 Description对于一个自然数M,求出所有的连续.pptVIP

题目描述 Description对于一个自然数M,求出所有的连续.ppt

  1. 1、本文档共12页,可阅读全部内容。
  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文档。上传文档
查看更多
题目描述 Description对于一个自然数M,求出所有的连续.ppt

题目描述?Description 对于一个自然数M,求出所有的连续的自然数段,使得这些连续自然数段的全部数字和为M. eg:1998+1999+2000+2001+2002=10000,所以从1998到2002的一个自然数段为M=10000的一个解。? 输入描述?Input Description 一个数M 输出描述?Output Description 每行两个数,为连续自然数段的一头一尾,所有输出行的第一个数按照升序排列 样例输入?Sample Input 10000 样例输出?Sample Output 18 142 297 328 388 412 1998 2002 算法一:用i枚举起点,用j枚举落点,用k来枚举起点到落点,ans求和,很容易得到 for i:=1 to m-1 do for j:=i to m-1 do begin for k:=i to j do inc(ans,k); if ans=m then writeln(i, ,j); ans:=0; end; 算法二:类似于算法一,只不过生略掉k,直接用求和等差数列公式(首项+末项)*项数/2,得到: for i:=1 to m-1 do for j:=i to m-1 do if (i+j)*(j-i+1)/2=m then writeln(i,‘ ’,j); 算法三:建立在算法二的基础上,用i枚举起点,进行二分查找结束点j,得到 function find(l,r:longint):longint; var x:longint; begin if lr then exit; x:=(l+r)div 2; if (i+x)*(x-i+1)/2=m then writeln(i, ,x) else if (i+x)*(x-i+1)/2m then find(l,x-1) else find(x+1,r); end; 算法四:对于算法二的优化,如果和大于m,j的扩大只会使和也扩大,所以就直接退出循环 for i:=1 to m-1 do for j:=i to m-1 do if (i+j)*(j-i+1)/2=m then writeln(i, ,j) else if (i+j)*(j-i+1)/2m then break; 八年级下学期时,将会学习一元二次方程的解法: 首先明确形如一元二次方程 ax^2+bx+c(a0)的求根公式 ? x=(-b+sqrt(b^2-4*a*c))/2 或 (-b-sqrt(b^2-4*a*c))/2 推导方法可以用配方法,左边配成一个完全平方式,右边只含有常数项,就可以求出x 算法五:设起点为i,共有n个数 则结束的数为(i+n-1)所以得 (i+i+n-1)*n/2=m ? n^2-(2*i-1)-2*m=0 ? 所以n=(1-2*i+sqrt((2*i-1)^2-4*1*(-2*m)))/2 ? ?(大家自行思考为什么忽略另一个解) ? ? ? ?n=(1-2*i+sqrt(4*i*i-4*i+1+8*m))/2 ? ? ? 所以只要用i枚举起点,在判断n是否为自然数然后输出 ? 就可以得到 ? for i:=1 to m-1 do ?if trunc((1-2*i+sqrt(4*i*i-4*i+1+8*m))/2) =(1-2*i+sqrt(4*i*i-4*i+1+8*m))/2 then writeln(i,‘ ’,i+((1-2*i+sqrt(4*i*i-4*i+1+8*m))/2-1):0:0); 算法六:以上五种算法都是枚举起点i,不妨换个角度,枚举长度i,设起点为x,则结束点为x+i-1,所以,(x+x+i-1)*i/2=m (2*x+i-1)*i=2*m 2*i*x+i*i-i=2*m 2*i*x=2*m-i*i+i x=(2*m-i*i+i)/(2*i) 只要判断x是否为自然数,然后输出。 注意:1.x为自然数 2.题目要求是升序输出,所以枚举长度是要倒序 for i:=trunc(sqrt(4*m+0.25)-0.5) downto 2 do if (trunc((-i*i+i+2*m)/(2*i))= (-i*i+i+2*m)/(2*i))and ((-i*i+i+2*m)/(2*i)0) then writeln((-i*i+i+2*m)/(

文档评论(0)

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

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

1亿VIP精品文档

相关文档