Board logo

标题: [数值计算] 批处理小数转分数,支持循环小数 [打印本页]

作者: yslyxqysl    时间: 2009-3-29 10:49     标题: 批处理小数转分数,支持循环小数

如果整数部分是0,可以直接省略整数部分。

逗号表示循环节的第一位。
另一个循环点会自动标在最后一位。
例如:
                     .                        . .
0.1,6 ---> 0.16    3.,54 ---> 3.54

思路介绍:
拿0.1666...当例子,我们把它分成3个部分
016
整数部分(a)小数部分非循环节部分(b)循环节(c)
公式也有了:
a+b/10^(Len(b))+c/((10^(Len(c))-1)*10^(Len(b)))
(Len表示字数统计)
给我数一下括号...啊,对了。
这样一来,循环小数转分数就轻而易举地解决了,其他小数自然也就不在话下。
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. title 小数转分数&color 60
  4. mode con cols=31 lines=7
  5. set er=goto err
  6. :loop
  7. cls&echo 你可以用,表示循环节
  8. echo 合法的输入格式:
  9. echo,                 .
  10. echo 1.8  .8,3(表示0.83)  5.,285714
  11. set input=&set /p input=请输入:
  12. echo !input!|findstr "^[0-9.,]*$">nul||%er%
  13. if "!input:.=!"=="!input!" ^
  14. for /f "tokens=* delims=0" %%i in ("!input!") do (
  15. set /a tp=%%i+1-1
  16. echo !tp!
  17. pause>nul
  18. goto :loop
  19. )
  20. set tp=!input:*.=!&if not "!tp:.=!"=="!tp!" %er%
  21. if not "!input:,=!"=="!input!" (echo !input:*,=!|findstr "[.,]">nul&&%er%)
  22. echo !input!|findstr "[.,]0*$">nul&&%er%
  23. if "!input:~0,1!"=="." set input=0!input!
  24. set tp=!input:*.=.!
  25. set a=!input:%tp%=!
  26. set b=!input:%a%.=!&set tp=!input:*,=,!
  27. set b=!b:%tp%=!&if "!input:,=!"=="!input!" (set c=) else set c=!tp:,=!
  28. for /f "tokens=* delims=0" %%i in ("!a!") do set /a a=%%i+1-1
  29. call :len "!b!" blength
  30. call :len "!c!" clength
  31. call :string !blength! 0 bnum0
  32. call :string !clength! 9 cnum9
  33. if "!c!"=="" (
  34. set /a "d=!b!"&set e=1!bnum0!
  35. ) else (
  36. set /a "d=(!b!+1-1)*(!cnum9!+1-1)+(!c!+1-1)"&set e=!cnum9!!bnum0!
  37. )
  38. call :gcd !d! !e! decomdiv
  39. set /a d/=!decomdiv!,e/=!decomdiv!
  40. if !a! neq 0 set /p=!a!+<nul
  41. echo !d!/!e!
  42. pause>nul
  43. goto loop
  44. :err
  45. echo cls&echo 非法输入&pause>nul&goto loop
  46. :len
  47. set "string=%~1"
  48. set len=0
  49. if "!string!"=="" set %2=%len%&goto :eof
  50. :len2
  51. if "!string:~%len%,1!"=="" (set %2=%len%&goto :eof) else set /a len+=1&&goto len2
  52. :string
  53. set "%3="&(for /l %%i in (1 1 %1) do set "%3=!%3!%2")&goto :eof
  54. :gcd
  55. set /a tempa=%1,tempb=%2
  56. :gcd2
  57. if !tempa! geq !tempb! (set /a tempa=!tempa!%%!tempb!) else set /a tempb=!tempb!%%!tempa!
  58. if !tempa!==0 set %3=!tempb!&goto :eof
  59. 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://www.bathome.net/) Powered by Discuz! 7.2