算法讲解之一题多解.PPT

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法讲解之 一 题 多 解 模拟开关 FPC程序编写 模拟开关 【问题描述】 有n盏灯排成一排,依次标号1,2,…,n,每盏灯都有一根拉线开关,最初电灯都是关着的.现有n个人,都沿着电灯路线走过,第一个人走过时,把凡是号码是1的倍数的灯的开关拉一下;接着第二个人走过时,把凡是号码是2的倍数的灯的开关拉一下;第三个走过时,把凡是号码是3的倍数的灯的开关拉一下;……;最后,第n个人走过时,把最后那盏灯的开关拉一下.问最后都有哪些灯是开着的? 【输入文件】文件名:moni.in 文件中只有一行,包含一个整数(其中5≤n≤10000) 【输出文件】文件名:moni.out 文件共一行,分别为哪些开着灯的编号。 【样例输入】 10 【样例输出】 1 4 9 模 拟 运 行 (双层FOR循环) 算法一 算法讲解 为了判断灯的开关,我们需要标志性数组: b:array[1..10000]of longint; 根据题目我们知道,拉开关的规律就是依次把1的倍数、2的倍数直到n的倍数的开关拉一下,那么我们就可以得到第一次for循环: for i:=1 to n do 因为每次所有灯都要判断,所以第二层for循环就是: for j:=1 to n do 当第j盏灯是i的倍数时,就将b[j]置为相反的值: If j mod i=0 then b[j]:=not b[j]; 最后用for循环判断灯是否开着,如果b[j]仍为原值则输出: for i:=1 to n do if not b[j] then write(j,’ ‘); 程序(moni_1.pas) var n,i,j:longint; a:array[1..10000]of boolean; begin read(n); for i:=1 to n do for j:=1 to n do if j mod i=0 then a[j]:=not a[j]; for i:=1 to n do if a[i] then write(i, ); end. (运行次数:n ) 2 数 学 方 法 (单层FOR循环) 算法二 算法讲解 根据观察我们发现,最后仍然亮着的都是自然数的平方数,所以可以得到一层运算: for i:=1 to trunc(sqrt(n)) do write(i*i,’ ‘); 程序(moni_2.pas) var n,i:longint; begin read(n); for i:=1 to trunc(sqrt(n)) do write(i*i, ); end. (运行次数:√n ) Thank you!

文档评论(0)

fengruiling + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档