标题: 批处理找1-100以内的所有勾股数? [打印本页]
作者: youxi01 时间: 2008-1-3 23:14 标题: 批处理找1-100以内的所有勾股数?
勾股数即符合勾股定律(勾三股四弦五)的数。
通俗的说就是两个数的平方和等于另外一个数的平方
如:3^2+4^2=5^2
作者: foxJL 时间: 2008-3-23 15:14
- @echo off
- set x=1
- set /p max=打印出多少以内的勾股弦组合(勾^>3):
- :x
- set /a x+=2,s=x*x,y=s/2,z=y+1
- echo %x%,%y%,%z%
- if %x% lss %max% goto x
- pause
复制代码
作者: foxJL 时间: 2008-3-23 15:22
上面的代码算的不够全面.
[ 本帖最后由 foxJL 于 2008-3-23 15:48 编辑 ]
作者: more 时间: 2008-3-27 09:49
- @echo off
- setlocal enabledelayedexpansion
- for /l %%a in (1,1,100) do (
- for /l %%b in (%%a,1,100) do (
- for /l %%c in (%%b,1,100) do (
- set /a aa=%%a*%%a+%%b*%%b
- set /a ab=%%c*%%c
- if !aa!==!ab! echo %%a %%b %%c
- )
- )
- )
- echo.&pause
复制代码
作者: 随风 时间: 2008-3-28 20:51
4楼方法不错,稍加改进,不用临时文件,并取消对临时文件的循环次数。同时过滤掉了重复的数
:- @echo off&setlocal EnableDelayedExpansion
- for /l %%a in (1 1 100) do (
- set /a a%%a=%%a*%%a
- set t!a%%a!=%%a
- )
- for /l %%a in (1 1 100) do (
- for /l %%b in (%%a 1 100) do (
- set /a c=%%a*%%a+%%b*%%b
- if defined t!c! (
- call echo %%a %%b %%t!c!%%
- set /a abc+=1
- )))
- echo.&echo 共有 %abc% 个
- echo.&pause
复制代码
[ 本帖最后由 随风 于 2008-3-28 20:56 编辑 ]
作者: lhjoanna 时间: 2008-10-31 10:50
恩,第一个for循环是把100以内的所有的数的平方与变量t!a%%a!对应起来吧?然后只要两个数相加的平方已经定义过,就是勾股数了。是这样理解吧?
作者: keen 时间: 2009-4-2 13:46
不能避免重复的,例如:3^2+4^2=5^2 4^2+3^2=5^2,请高手指正!
- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (1 1 100) do (
- set /a s1=%%i*%%i
- for /l %%j in (1 1 100) do (
- set /a s2=%%j*%%j
- set /a s3=!s1!+!s2!
- for /l %%k in (1 1 100) do (
- set /a s4=%%k*%%k
- if "!s4!"=="!s3!" echo %%i^^^^2+%%j^^^^2=!s4!
- )
- )
- )
- pause
复制代码
[ 本帖最后由 keen 于 2009-4-2 13:54 编辑 ]
作者: sjzong 时间: 2009-5-2 01:45
这个题目如果用三个循环的话,那效率是比较低。先是kclmx先引入临时文件,然后是随风进行改进,厉害,随风版主的代码效率高多了!
作者: pusofalse 时间: 2009-5-2 01:56 标题: 回复 9楼 的帖子
下一层for的起始值换成上一层for中递增的值试下。
作者: defanive 时间: 2009-5-2 09:17
这个题目,不用递归法吧,效率低。。。
感觉最自然就是循环a,分解质因数,然后解方程求出b,c。。。
并且令b<a时才显示出来,就可以避免重复,而且应该所有都能罗列了吧。。。
作者: keen 时间: 2009-5-12 18:52
11楼的想法跟我今天才想到得一样。避免了重复。修改9楼代码如下:- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (1 1 100) do (
- set /a s1=%%i*%%i
- for /l %%j in (%%i 1 100) do (
- set /a s2=%%j*%%j
- set /a s3=!s1!+!s2!
- for /l %%k in (1 1 100) do (
- set /a s4=%%k*%%k
- if "!s4!"=="!s3!" echo %%i^^^^2+%%j^^^^2=!s4!
- )
- )
- )
- pause
复制代码
但是效率还是低下,期待高手给出效率高的代码。
[ 本帖最后由 keen 于 2009-5-12 18:54 编辑 ]
作者: plp626 时间: 2009-10-15 14: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 编辑 ]
作者: Seter 时间: 2009-10-15 19:20
可恶的plp...居然抢了我的位置...话说这个解法我似乎看到过...就是对于任意数字m,n,m^2+n^2,m^2-n^2,2mn为勾股数...
不过我自己曾经也研究过勾股数的计算...我做个效率低点的
[ 本帖最后由 Seter 于 2009-10-15 19:30 编辑 ]
作者: poxi 时间: 2010-7-19 22:07
新手来了.........试了一下...弄出来好多,,ms去了重....
答:- @echo off
- setlocal EnableDelayedExpansion
- for /l %%a in (1,1,100) do (
- set zs1=%%a
- set /a m1=!zs1!*!zs1!
- for /l %%b in (!zs1!,1,100) do (
- set zs2=%%b
- set /a m2=!zs2!*!zs2!
- for /l %%c in (!zs2!,1,100) do (
- set zs3=%%c
- set /a m3=!zs3!*!zs3!
- set /a ds=!m1!+!m2!
- if !ds! equ !m3! echo !zs1! !zs2! !zs3!
- )
- )
- )
- pause
复制代码
===============
对了的话要奖励...........end;
作者: 尘丶 时间: 2015-8-10 16:24
- @echo off&setlocal enabledelayedexpansion
- set /p num=输入多少以内的勾股数:
- for /l %%a in (3,1,%num%) do (
- for /l %%b in (4,1,%num%) do (
- for /l %%c in (5,1,%num%) do (
- set /a num1=%%a*%%a
- set /a num2=%%b*%%b
- set /a num3=%%c*%%c
- set /a num4=!num1!+!num2!
- if !num3!==!num4! echo;%%a,%%b,%%c
- )
- )
- )
- pause
复制代码
终于能写一道数学批处理了。
作者: bluenightsky 时间: 2015-8-12 18:03
回复 1# youxi01
能做出100万位数以上的勾股吗
作者: unknown_world 时间: 2015-10-19 14:33
- @echo off & setlocal enabledelayedexpansion
-
- for /l %%i in (1 1 100) do (
- for /l %%j in (%%i 1 100) do (
- for /l %%k in (%%i 1 100) do (
- set /a l=%%i*%%i+%%j*%%j
- set /a m=%%k*%%k
- if !l!==!m! echo %%i*%%i+%%j*%%j=%%k*%%k
- )
- )
- )
-
- pause > nul
复制代码
作者: 小程936 时间: 2019-1-10 11:04
本帖最后由 小程936 于 2019-1-11 17:50 编辑
勾股数生成器
本程序可生成 所有小于(max-1)的平方的互质勾股数,无一遗漏。
算法依据:
任何一个勾股数,均可表示为 v(n2*v2),2vnm,v(n2+v2) 的形式
如果v=1,n+m=奇数,且n与m互质,则算出的勾股数(A,B,C)也一定互质。
详细公式
m>n,m+n=奇数,m与n互质- set /a max=61
- rem 这个数越大。生成的勾股数就越多。你可以改成2000试试。
- rem 小程936原创出品。版权所有。
-
- @echo off&Setlocal enabledelayedexpansion&set /a b=1
- set /a min=2
- rem 从第min次循环开始(默认值为2)。从第(max-1)次循环后结束。max值越高求到的勾股数越多。
- rem 自动排除非互质项,(3,4,5)互质,而(6,8,10)不互质。输出结果为a,b,c (第几次循环,此次循环得到的第几个值)
-
- set ga=勾股数-%min%-%max%.txt
- echo %ga%>%ga%&title %ga%
- rem 控制输出文件名和文件首行。
-
- for /l %%j in (%min%,1,%max%) do (
- for /l %%k in (!b!,2,%%j) do (
-
- set /a a=m=%%j,b=n=%%k
- call :f
- if "!m!"=="1" (
- rem 看看a与b是否互质。
-
- set /a cmin=a*a+b*b,bmin=a*a-b*b,amin=2*a*b
- rem 计算a,b对应的勾股数amin,bmin,cmin (a,b初始值2,1)
-
- if !amin! GTR !bmin! set /a v=bmin,bmin=amin,amin=v
- echo.!amin!,!bmin!,!cmin! ^(%%j,%%k^)
- rem 若bmin小于amin,交换位置。& 之后……记录下来。
- )
- )>>%ga%
- echo !a!/%max%
- rem 显示循环周期,
-
- set /a b=a%%2
- if "!b!"=="0" set /a b=2
- rem 重置b(若a为偶则b=2,若a为奇则b=1),之后a加1。
- )
-
- start "" %ga%
- exit
- rem 打开记录文件,结束程序。
-
- :f
- @set /a r=m%%n,m=n,n=r
- if "%r%"=="0" goto :eof
- goto f
- rem 计算m与n的最大公因数,输出m(临时占用变量r)
复制代码
去注释版- set /a max=61
- @echo off&Setlocal enabledelayedexpansion&set /a b=1
- set /a min=2
- set ga=勾股数-%min%-%max%.txt
- echo %ga%>%ga%&title %ga%
- for /l %%j in (%min%,1,%max%) do (
- for /l %%k in (!b!,2,%%j) do (
- set /a a=m=%%j,b=n=%%k
- call :f
- if "!m!"=="1" (
- set /a cmin=a*a+b*b,bmin=a*a-b*b,amin=2*a*b
- if !amin! GTR !bmin! set /a v=bmin,bmin=amin,amin=v
- echo.!amin!,!bmin!,!cmin! ^(%%j,%%k^)
- ))>>%ga%
- echo !a!/%max%
- set /a b=a%%2
- if "!b!"=="0" set /a b=2
- )
- start "" %ga%
- exit
- :f
- @set /a r=m%%n,m=n,n=r
- if "%r%"=="0" goto :eof
- goto f
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |