本帖最后由 小程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
复制代码
|