找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 53440|回复: 20

批处理找1-100以内的所有勾股数?

[复制链接]
发表于 2008-1-3 23:14:19 | 显示全部楼层 |阅读模式
勾股数即符合勾股定律(勾三股四弦五)的数。
通俗的说就是两个数的平方和等于另外一个数的平方
如:3^2+4^2=5^2
发表于 2008-3-23 15:14:11 | 显示全部楼层
  1. @echo off
  2. set x=1
  3. set /p max=打印出多少以内的勾股弦组合(勾^>3):
  4. :x
  5. set /a x+=2,s=x*x,y=s/2,z=y+1
  6. echo %x%,%y%,%z%
  7. if %x% lss %max% goto x
  8. pause
复制代码
发表于 2008-3-23 15:22:15 | 显示全部楼层
上面的代码算的不够全面.

[ 本帖最后由 foxJL 于 2008-3-23 15:48 编辑 ]
发表于 2008-3-27 09:49:01 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1,1,100) do (
  4. for /l %%b in (%%a,1,100) do (
  5. for /l %%c in (%%b,1,100) do (
  6. set /a aa=%%a*%%a+%%b*%%b
  7. set /a ab=%%c*%%c
  8. if !aa!==!ab! echo %%a %%b %%c
  9. )
  10. )
  11. )
  12. echo.&pause
复制代码
发表于 2008-3-28 20:51:51 | 显示全部楼层
4楼方法不错,稍加改进,不用临时文件,并取消对临时文件的循环次数。同时过滤掉了重复的数
:
  1. @echo off&setlocal EnableDelayedExpansion
  2. for /l %%a in (1 1 100) do (
  3.   set /a a%%a=%%a*%%a
  4.   set t!a%%a!=%%a
  5. )
  6.   for /l %%a in (1 1 100) do (
  7.   for /l %%b in (%%a 1 100) do (
  8.   set /a c=%%a*%%a+%%b*%%b
  9.   if defined t!c! (
  10.   call echo %%a %%b %%t!c!%%
  11.   set /a abc+=1
  12. )))
  13. echo.&echo 共有 %abc% 个
  14. echo.&pause
复制代码

[ 本帖最后由 随风 于 2008-3-28 20:56 编辑 ]
发表于 2008-10-31 10:50:30 | 显示全部楼层
恩,第一个for循环是把100以内的所有的数的平方与变量t!a%%a!对应起来吧?然后只要两个数相加的平方已经定义过,就是勾股数了。是这样理解吧?
发表于 2009-4-2 13:46:47 | 显示全部楼层
不能避免重复的,例如:3^2+4^2=5^2    4^2+3^2=5^2,请高手指正!

  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1 1 100) do (
  3.     set /a s1=%%i*%%i
  4.         for /l %%j in (1 1 100) do (
  5.             set /a s2=%%j*%%j
  6.             set /a s3=!s1!+!s2!   
  7.                 for /l %%k in (1 1 100) do (
  8.                     set /a s4=%%k*%%k
  9.                     if "!s4!"=="!s3!" echo %%i^^^^2+%%j^^^^2=!s4!
  10. )
  11. )
  12. )
  13. pause
复制代码

[ 本帖最后由 keen 于 2009-4-2 13:54 编辑 ]
发表于 2009-5-2 01:45:04 | 显示全部楼层
这个题目如果用三个循环的话,那效率是比较低。先是kclmx先引入临时文件,然后是随风进行改进,厉害,随风版主的代码效率高多了!
发表于 2009-5-2 01:56:08 | 显示全部楼层

回复 9楼 的帖子

下一层for的起始值换成上一层for中递增的值试下。
发表于 2009-5-2 09:17:22 | 显示全部楼层
这个题目,不用递归法吧,效率低。。。
感觉最自然就是循环a,分解质因数,然后解方程求出b,c。。。
并且令b<a时才显示出来,就可以避免重复,而且应该所有都能罗列了吧。。。
发表于 2009-5-12 18:52:05 | 显示全部楼层
11楼的想法跟我今天才想到得一样。避免了重复。修改9楼代码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1 1 100) do (
  3.     set /a s1=%%i*%%i
  4.         for /l %%j in (%%i 1 100) do (
  5.             set /a s2=%%j*%%j
  6.             set /a s3=!s1!+!s2!
  7.                 for /l %%k in (1 1 100) do (
  8.                     set /a s4=%%k*%%k
  9.                     if "!s4!"=="!s3!" echo %%i^^^^2+%%j^^^^2=!s4!
  10. )
  11. )
  12. )
  13. pause
复制代码
但是效率还是低下,期待高手给出效率高的代码。

[ 本帖最后由 keen 于 2009-5-12 18:54 编辑 ]
发表于 2009-10-15 14:43:43 | 显示全部楼层
真正的秒杀:
@echo off&if not %1.==. call%*&exit/b:: Code By plp626
title 输出任意多的互质(素)的勾股数&echo 稍等...
set MAX=30  &rem ::1000的开平方为31.6,这里设定MAX为30,就已经遍历1000以内的勾股质数
set "_isprime=set #r=+&for /l %%a in (1 1 6)do if ^!#r^! neq 0 (set/a #r=#1%%#2,#1=#2,#2=#r) else set ans=!#1!"
for /f "delims=" %%a in ('%~s0 :rtnum^|sort')do echo.%%a
pause&exit/b
:rtnum
setlocal enabledelayedexpansion&set "s=        "
for /l %%n in (1 1 %MAX%)do (set/a tp=%%n+1
for /l %%m in (!tp! 2 %MAX%)do (set #1=%%m&set #2=%%n&%_isprime%
        if !ans! equ 1 (set/a mm=%%m*%%m,nn=%%n*%%n,a=mm-nn,b=2*%%m*%%n,c=mm+nn
                set a=%s%!a!&set b=%s%!b!&set c=%s%!c!
        if !a! lss !b! (echo !a:~-7! !b:~-7! !c:~-7!) else echo !b:~-7! !a:~-7! !c:~-7!
)))
exit/b
[ 本帖最后由 plp626 于 2009-10-15 14:46 编辑 ]

评分

参与人数 3PB +60 技术 +1 收起 理由
随风 + 20 + 1 不是一般的猛!
523066680 + 20 猛nan
lxzzr + 20 猛男.

查看全部评分

发表于 2009-10-15 19:20:37 | 显示全部楼层
可恶的plp...居然抢了我的位置...话说这个解法我似乎看到过...就是对于任意数字m,n,m^2+n^2,m^2-n^2,2mn为勾股数...
不过我自己曾经也研究过勾股数的计算...我做个效率低点的

[ 本帖最后由 Seter 于 2009-10-15 19:30 编辑 ]
发表于 2010-7-19 22:07:37 | 显示全部楼层
新手来了.........试了一下...弄出来好多,,ms去了重....
答:
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. for /l %%a in (1,1,100) do (
  4. set zs1=%%a
  5. set /a m1=!zs1!*!zs1!
  6. for /l %%b in (!zs1!,1,100) do (
  7. set zs2=%%b
  8. set /a m2=!zs2!*!zs2!
  9. for /l %%c in (!zs2!,1,100) do (
  10. set zs3=%%c
  11. set /a m3=!zs3!*!zs3!
  12. set /a ds=!m1!+!m2!
  13. if !ds! equ !m3! echo !zs1! !zs2! !zs3!
  14. )
  15. )
  16. )
  17. pause
复制代码


===============
对了的话要奖励...........end;
发表于 2015-8-10 16:24:25 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p num=输入多少以内的勾股数:
  3. for /l %%a in (3,1,%num%) do (
  4.     for /l %%b in (4,1,%num%) do (
  5.         for /l %%c in (5,1,%num%) do (
  6.             set /a num1=%%a*%%a
  7.             set /a num2=%%b*%%b
  8.             set /a num3=%%c*%%c  
  9.             set /a num4=!num1!+!num2!
  10.             if !num3!==!num4! echo;%%a,%%b,%%c
  11. )
  12. )
  13. )
  14. pause
复制代码
终于能写一道数学批处理了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:11 , Processed in 0.023609 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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