标题: [数值计算] 【共同参与】批处理做简单分数运算 [打印本页]
作者: 523066680 时间: 2009-2-1 20:02 标题: 【共同参与】批处理做简单分数运算
用批处理做简单的分数加减乘除运算,如果答案不是整数 就用分数形式表示。但是可以化简的要化简。
回帖中可以只写一种运算,重在参与^_^
(多多捧场啊 我很想很想找个好的话题 现在也就这个了,希望能提起大家的兴趣。)
[ 本帖最后由 523066680 于 2009-2-1 20:08 编辑 ]
作者: defanive 时间: 2009-2-1 20:50
先解决约分和通分吧,没这两个其他运算都不可能。。。
300P里面有最大公约数和最小公倍数的资料。。。
作者: BBCC 时间: 2009-2-2 08:26
输入的时候是用 2/3 这样的形式输入吗?
作者: BBCC 时间: 2009-2-2 09:05
- :gcd
- set /a n=%1, m=%2
- :loop
- if %n% gtr %m% (set /a temp=n, n=m, m=temp)
- set /a r=m%%n
- if %r%==0 (set /a gcd=n, lcm=%1*%2/n) else (set /a m=n, n=r&goto :loop)
复制代码
这个求最大公约数.
可能两个分数就比较易算,如果是多个的时候该怎样来?
[ 本帖最后由 BBCC 于 2009-2-2 09:16 编辑 ]
作者: defanive 时间: 2009-2-2 12:32
写分数运算的话LS的代码要整理成函数,不然的话很麻烦。。。
话说LS用的是辗转相除么。。。
作者: BBCC 时间: 2009-2-2 15:43
是的.
如何改成函数形式啊.
加一个return?
作者: BBCC 时间: 2009-2-2 18:30
其实最重要是找出算法,写代码很小的问题.
作者: defanive 时间: 2009-2-2 19:51 标题: 改
-
- :gcd
- setlocal enableextensions
- set /a "n=%~1, m=%~2"
- :gcd_1
- if %n% gtr %m% (set /a temp=n, n=m, m=temp)
- set /a r=m%%n
- if %r%==0 (
- endlocal&set /a "%~3=%n%"&set /a "%~4=%~1*%~2/%n%"
- goto :EOF
- ) else (
- set /a m=n, n=r
- goto :gcd_1
- )
复制代码
例如 call :gcd 15 9 g1 l1 之后,15和9的最小公约数和最大公倍数分别被保存在g1和l1变量里了。。。
效率很高,很不错。。。
作者: BBCC 时间: 2009-2-2 21:50
但如果有三个或以上呢?
这个问题就是我一直在想的,是重复调用还是怎样呢?
如果重复调用就又要考虑如何设置变量的问题咯?
------------------------------------------------------------------
现在我的思路就是
输入m,n--------分解分母x1,x2--------gcd(x1,x2)-----------通分m,n------------相加answer=m+n-------------输出answer
这是个最普通的思路,但是有没有其他更快捷的算法呢?
作者: defanive 时间: 2009-2-2 22:21
很好很简单,三个以上我们再写一个函数,不过前提是有gcd函数。。。
通分思路:N1、N2最小公倍数G1,G1、N3最小公倍数G2,G2、N4最小公倍数G3,G3、N5……
一直到末,配合shift就可以了,然后改成函数。。。
有一点要注意,既然都开始做了,那就做到底,支持1/2+2/3这种格式。。。
作者: BBCC 时间: 2009-2-2 22:26
我要上学啊,囧,今年初三了...
作者: defanive 时间: 2009-2-2 22:32
我也才初二撒,不过10号才开学。。。
作者: 523066680 时间: 2009-2-5 20:55
defanive 和 bc这么认真对待,我感到挺惭愧的(论坛其他人呢?)
怎么说也得弄一部分代码出来。
以下代码对于两个分数的加减运算,没有考虑什么其他情况,草草的贴上来了。
- @echo off &setlocal enabledelayedexpansion
- set /p input="输入格式如 1/2 + 3/4 : "
- call :readinput "%input%" inp
- call :readinput "%inp1:/= %" left
- call :readinput "%inp3:/= %" right
- for %%a in (+ -) do (if %inp2% equ %%a (
- set /a left=left1*right2,right=right1*left2,lr1=left%%aright,lr2=left2*right2
- call :cut !lr1! !lr2!
- set /a lr1=lr1/del,lr2=lr2/del
- echo,!lr1!/!lr2!
- ))
-
- pause>nul &exit
-
- :readinput
- set readinput=0
- for %%a in (%~1) do (set /a "readinput+=1" &set %2!readinput!=%%a)
- goto :eof
-
- ::Function::取出最大公约数,赋值给del
- :cut
- set /a a=%1,b=%2
- :cut-1
- set /a mod=a%%b,adb=a/b
- if %mod% equ 0 (set del=%b%) else (set /a "a=b,b=mod" &goto :cut-1)
- goto :eof
复制代码
[ 本帖最后由 523066680 于 2009-2-5 20:58 编辑 ]
作者: 523066680 时间: 2009-2-5 21:01
上面在讨论读几年级呢?
好好加油吧,年龄不是问题,问题是时间在流逝 我以为自己算比较年轻的
哪知光阴似箭,成绩没考好,计算机也没懂多少,过了新年就19了,眼看就要20了,悲哀。
-----------------------------------------------------------------------------------------------------------------
又看了一下帖子,关于多个分数的,做成函数,反复利用吧~
比如先算a+b=AB 再算AB+c .......
[ 本帖最后由 523066680 于 2009-2-5 21:07 编辑 ]
作者: defanive 时间: 2009-2-5 21:08
做成函数好吧。。。
效果很不错。。。
作者: 523066680 时间: 2009-2-5 21:14 标题: 回复 7楼 的帖子
Re 7 楼
代码问题可不小
[ 本帖最后由 523066680 于 2009-2-7 14:59 编辑 ]
作者: wxcute 时间: 2009-2-5 21:18
我来描述一下程序应有什么功能罢
判断输入正确性及计算顺序;
对两个分数进行相应四则运算,直到计算完成;
循环调用(这个可能比较难)
最小公约数、最大公倍数计算(已经有了);
输入与输出显示。
作者: defanive 时间: 2009-2-5 21:26
优先级的判断很有难度,括号优先、乘除优先,还有很多,都是很麻烦的。。。
作者: BBCC 时间: 2009-2-5 21:40
给个小建议:运算符可以放在前面
+ 1/2 1/3
还有乘除法呢?可以将不同级运算算放在不同的模块里,然后分开调用,应该维护修改都比较方便的.
作者: defanive 时间: 2009-2-6 17:37
所以说做成函数最方便了。。。
作者: 523066680 时间: 2009-2-7 14:54
小改一下~ 帖子沉的真快 我下个星期再来喽~ 慢慢来~
简单的两个分数之间的加 减 乘 除 乘用 x 表示- @echo off &setlocal enabledelayedexpansion
- set /p input="输入格式如 1/2 + 3/4 两分数之间的乘法用 x 表示 : "
- call :readinput "%input%" inp
- call :readinput "%inp1:/= %" left
- call :readinput "%inp3:/= %" right
- if %inp2% equ + (set /a lr1=left1*right2 + right1*left2,lr2=left2*right2)
- if %inp2% equ - (set /a lr1=left1*right2 - right1*left2,lr2=left2*right2)
- if %inp2% equ x (set /a lr1=left1*right1,lr2=left2*right2)
- if %inp2% equ / (set /a lr1=left1*right2,lr2=left2*right1)
- call :cut %lr1% %lr2%
- set /a lr1=lr1/del,lr2=lr2/del
- echo,%lr1%/%lr2%
- pause>nul &exit
-
- :readinput
- set readinput=0
- for %%a in (%~1) do (set /a "readinput+=1" &set %2!readinput!=%%a)
- goto :eof
-
- ::Function::取出最大公约数,赋值给del
- :cut
- set /a a=%1,b=%2
- :cut-1
- set /a mod=a%%b,adb=a/b
- if %mod% equ 0 (set del=%b%) else (set /a "a=b,b=mod" &goto :cut-1)
- goto :eof
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |