练习004 - 计算100以内的勾股数
本帖最后由 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。 本帖最后由 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秒的,但我用最原始的方法解题,发现始终在1s以内,所以改成500ms了。
2#的代码虽说调用了其他函数,但效率很强大,学习了~! 先占个靠前排的楼,今晚喝酒多了,明天来把我的答案奉上。 先参考参考别人写的。 参考参考..... 本帖最后由 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) 回复 7# afan
学习了。($i ^ 2 + $x ^ 2) ^ 0.5,实在是精妙。
此题一旦用到3重循环,效率一下就降低了。
7#的代码,我们的思路差不多,区别在于,afan兄用了3重循环,我首先定义了一个包含20000个元素的1维数组(接近于表驱动的思路)。
另外,2#为何要用StringIsInt判断?用IsInt试下。 回复afan
学习了。($i ^ 2 + $x ^ 2) ^ 0.5,实在是精妙。
此题一旦用到3重循环,效率一下就降 ...
pusofalse 发表于 2010-2-27 00:35 http://www.autoitx.com/images/common/back.gif
IsInt ... 我错了,只用过 StringIsInt ,太不熟悉基本路线了,感谢指正 这个要学习的,回复一下看看 这些题目我也许跟不上,我也来学习一下。 来学习啊啊,多学习好啊 本帖最后由 afan 于 2010-3-2 10:15 编辑
再来练习,这次没调用其它函数,应该符合拓展了……Local $stmp, $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) 我是来学习的 本帖最后由 gapkiller 于 2010-2-27 14:26 编辑
不是最高效的,但一定是最精简的...180ms左右
**** Hidden Message *****