标题: [数值计算] 批处理小数转分数,支持循环小数 [打印本页]
作者: yslyxqysl 时间: 2009-3-29 10:49 标题: 批处理小数转分数,支持循环小数
如果整数部分是0,可以直接省略整数部分。
逗号表示循环节的第一位。
另一个循环点会自动标在最后一位。
例如:
. . .
0.1,6 ---> 0.16 3.,54 ---> 3.54
思路介绍:
拿0.1666...当例子,我们把它分成3个部分
0 | 1 | 6 |
整数部分(a) | 小数部分非循环节部分(b) | 循环节(c) |
公式也有了:
a+b/10^(Len(b))+c/((10^(Len(c))-1)*10^(Len(b)))
(Len表示字数统计)
给我数一下括号...啊,对了。
这样一来,循环小数转分数就轻而易举地解决了,其他小数自然也就不在话下。- @echo off
- setlocal ENABLEDELAYEDEXPANSION
- title 小数转分数&color 60
- mode con cols=31 lines=7
- set er=goto err
- :loop
- cls&echo 你可以用,表示循环节
- echo 合法的输入格式:
- echo, .
- echo 1.8 .8,3(表示0.83) 5.,285714
- set input=&set /p input=请输入:
- echo !input!|findstr "^[0-9.,]*$">nul||%er%
- if "!input:.=!"=="!input!" ^
- for /f "tokens=* delims=0" %%i in ("!input!") do (
- set /a tp=%%i+1-1
- echo !tp!
- pause>nul
- goto :loop
- )
- set tp=!input:*.=!&if not "!tp:.=!"=="!tp!" %er%
- if not "!input:,=!"=="!input!" (echo !input:*,=!|findstr "[.,]">nul&&%er%)
- echo !input!|findstr "[.,]0*$">nul&&%er%
- if "!input:~0,1!"=="." set input=0!input!
- set tp=!input:*.=.!
- set a=!input:%tp%=!
- set b=!input:%a%.=!&set tp=!input:*,=,!
- set b=!b:%tp%=!&if "!input:,=!"=="!input!" (set c=) else set c=!tp:,=!
- for /f "tokens=* delims=0" %%i in ("!a!") do set /a a=%%i+1-1
- call :len "!b!" blength
- call :len "!c!" clength
- call :string !blength! 0 bnum0
- call :string !clength! 9 cnum9
- if "!c!"=="" (
- set /a "d=!b!"&set e=1!bnum0!
- ) else (
- set /a "d=(!b!+1-1)*(!cnum9!+1-1)+(!c!+1-1)"&set e=!cnum9!!bnum0!
- )
- call :gcd !d! !e! decomdiv
- set /a d/=!decomdiv!,e/=!decomdiv!
- if !a! neq 0 set /p=!a!+<nul
- echo !d!/!e!
- pause>nul
- goto loop
- :err
- echo cls&echo 非法输入&pause>nul&goto loop
- :len
- set "string=%~1"
- set len=0
- if "!string!"=="" set %2=%len%&goto :eof
- :len2
- if "!string:~%len%,1!"=="" (set %2=%len%&goto :eof) else set /a len+=1&&goto len2
- :string
- set "%3="&(for /l %%i in (1 1 %1) do set "%3=!%3!%2")&goto :eof
- :gcd
- set /a tempa=%1,tempb=%2
- :gcd2
- if !tempa! geq !tempb! (set /a tempa=!tempa!%%!tempb!) else set /a tempb=!tempb!%%!tempa!
- if !tempa!==0 set %3=!tempb!&goto :eof
- if !tempb!==0 (set %3=!tempa!&goto :eof) else goto gcd2
复制代码
作者: xxx 时间: 2009-3-29 11:02
牛,欢迎做成函数形式方便调用~~
作者: rat 时间: 2009-3-29 12:24
改下下面的代码,一次性生成假分数吧。另外形如1.00的会提示以0为除数的错误。
if !a! neq 0 set /p=!a!+<nul
echo !d!/!e!
作者: yslyxqysl 时间: 2009-3-29 13:08 标题: 回复 3楼 的帖子
已修复1.00的错误。
假分数就不必了吧,我们老师都叫我们写带分数的。
作者: 随风 时间: 2009-3-29 13:53
不明白你的逗号到底有什么用,到底怎样的输入才是合法的,不过感觉你的代码应该还可以再精简。
作者: Batcher 时间: 2009-3-29 14:10 标题: 回复 5楼 的帖子
逗号表示循环小数中的循环位所在位置
作者: garyng 时间: 2011-9-1 21:33
这...
可以帮我做数学题!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |