找回密码
 加入
搜索
查看: 20086|回复: 62

[效率算法] 练习004 - 计算100以内的勾股数

 火... [复制链接]
发表于 2010-2-26 22:02:35 | 显示全部楼层 |阅读模式
本帖最后由 pusofalse 于 2010-2-26 22:30 编辑

出题目的:数值计算

题解:
计算100以内的勾股数,如 3^2 + 4^2 = 5^2,(3*3 + 4*4 = 5*5)

要求:
1、禁止生成任何临时文件。
2、运行效率在500ms以内。
3、输出格式如图:

标题为运行时间,单位ms。

拓展:
1、运行时间为100ms以内。
2、禁止调用除下列以外的任何函数:
  TimerInit, TimerDiff - 计算运行时间。
  Msgbox - 输出结果。

加分规则:
1、正确输出结果:20。
2、不生成临时文件:21~30。
3、效率在500ms以内:31~50。
4、如果完成拓展中的要求,加分51~90。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-2-26 22:47:51 | 显示全部楼层
本帖最后由 afan 于 2010-3-2 10:13 编辑

做练习,未达到拓展要求……
Local $out, $i, $x, $tmp, $begin = TimerInit()
For $i = 1 To 98
        For $x = $i + 1 To 99
                $tmp = ($i ^ 2 + $x ^ 2) ^ 0.5
                If $tmp > 100 Then ExitLoop
                If IsInt($tmp) Then $out &= $i & ' ' & $x & ' ' & $tmp & @CRLF
        Next
Next
MsgBox(0, TimerDiff($begin), $out)

评分

参与人数 1金钱 +50 收起 理由
pusofalse + 50 强,学习了。

查看全部评分

 楼主| 发表于 2010-2-26 22:56:19 | 显示全部楼层
本来原帖中的效率要求是1秒的,但我用最原始的方法解题,发现始终在1s以内,所以改成500ms了。
2#的代码虽说调用了其他函数,但效率很强大,学习了~!
发表于 2010-2-26 23:04:44 | 显示全部楼层
先占个靠前排的楼,今晚喝酒多了,明天来把我的答案奉上。
发表于 2010-2-26 23:06:56 | 显示全部楼层
先参考参考别人写的。
发表于 2010-2-26 23:31:18 | 显示全部楼层
参考参考.....
发表于 2010-2-27 00:17:01 | 显示全部楼层
本帖最后由 afan 于 2010-3-2 10:15 编辑

下面为了拓展要求,不使用其它函数,纯粹3重循环…… 慢了许多,唉,脑筋短路了
Local $out, $i, $x, $z, $tmp, $begin = TimerInit()
For $i = 1 To 98
        For $x = $i + 1 To 99
                $tmp = ($i ^ 2 + $x ^ 2) ^ 0.5
                If $tmp > 100 Then ExitLoop
                For $z = $x + 1 To 100
                        If $z = $tmp Then $out &= $i & ' ' & $x & ' ' & $z & @CRLF
                Next
        Next
Next
MsgBox(0, TimerDiff($begin), $out)

评分

参与人数 1金钱 +80 收起 理由
pusofalse + 80 50分是为2#加的,30分是为7#加的。学习了, ...

查看全部评分

 楼主| 发表于 2010-2-27 00:35:19 | 显示全部楼层
回复 7# afan


    学习了。($i ^ 2 + $x ^ 2) ^ 0.5,实在是精妙。
此题一旦用到3重循环,效率一下就降低了。
7#的代码,我们的思路差不多,区别在于,afan兄用了3重循环,我首先定义了一个包含20000个元素的1维数组(接近于表驱动的思路)。
另外,2#为何要用StringIsInt判断?用IsInt试下。
发表于 2010-2-27 00:39:35 | 显示全部楼层
回复  afan


    学习了。($i ^ 2 + $x ^ 2) ^ 0.5,实在是精妙。
此题一旦用到3重循环,效率一下就降 ...
pusofalse 发表于 2010-2-27 00:35



    IsInt ... 我错了,只用过 StringIsInt ,太不熟悉基本路线了,感谢指正
发表于 2010-2-27 08:25:53 | 显示全部楼层
这个要学习的,回复一下看看
发表于 2010-2-27 10:37:54 | 显示全部楼层
这些题目我也许跟不上,我也来学习一下。
发表于 2010-2-27 11:19:06 | 显示全部楼层
来学习啊啊,多学习好啊
发表于 2010-2-27 11:23:18 | 显示全部楼层
本帖最后由 afan 于 2010-3-2 10:15 编辑

再来练习,这次没调用其它函数,应该符合拓展了……
Local $stmp[100 ^ 2 + 1], $out, $i, $x, $tmp, $begin = TimerInit()
For $i = 3 To 100
        $stmp[$i ^ 2] = 1
Next
For $i = 1 To 98
        For $x = $i + 1 To 99
                $tmp = $i ^ 2 + $x ^ 2
                If $tmp ^ 0.5 > 100 Then ExitLoop
                If $stmp[$tmp] Then $out &= $i & ' ' & $x & ' ' & $tmp ^ 0.5 & @CRLF
        Next
Next
MsgBox(0, TimerDiff($begin), $out)

评分

参与人数 1金钱 +90 收起 理由
pusofalse + 90 经典。

查看全部评分

发表于 2010-2-27 14:04:57 | 显示全部楼层
我是来学习的
发表于 2010-2-27 14:10:50 | 显示全部楼层
本帖最后由 gapkiller 于 2010-2-27 14:26 编辑

不是最高效的,但一定是最精简的...180ms左右
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1金钱 +50 收起 理由
pusofalse + 50 学习了。

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-29 23:16 , Processed in 0.100912 second(s), 31 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表