Board logo

标题: [数值计算] [讨论]如何用最简算式表示11个11相乘 [打印本页]

作者: ArdentMan    时间: 2011-7-1 15:17     标题: [讨论]如何用最简算式表示11个11相乘

平常我们是用set /a Anwser=11*11*11*11*11*11*11*11*11*11*11来表示11个11相乘,
但是这样写起来显得很罗索,
那么有没有更简单以及最简单的表达方式呢?
作者: Demon    时间: 2011-7-1 15:56

你听说过for么
作者: ArdentMan    时间: 2011-7-1 16:04

2# Demon
for有一个set /a算式简洁?
作者: mxxcgzxxx    时间: 2011-7-1 16:13

本帖最后由 mxxcgzxxx 于 2011-7-1 16:16 编辑
  1. set /a a*=(a*=(a*=(a=11)))*11*11*11
复制代码
原理是递归,第一层11,第二层11*11,第三层(11*11)*(11*11)
所以a*=(a*=(a*=(a=11)))就是8个11相乘了,加乘三个11就行了
写简单了,但要口算更长时间才能写出算式呵
作者: ArdentMan    时间: 2011-7-1 16:15

学习了,谢谢了!

但是如果这个11是变量呢,后面的加乘怎么得来?
作者: mxxcgzxxx    时间: 2011-7-1 16:18

5# ArdentMan

你是要求某数的幂次方吧,那要用另一个公式来算这个数是2的几次方余多少的问题
作者: ArdentMan    时间: 2011-7-1 16:22

如此还不如:
set /a Anwser=11
for /l %%i in (1,1,%Anwser%) do set /a Anwser*=Anwser
作者: Hello123World    时间: 2011-7-1 16:35

你的算法是错误的,如果是11个,应该这么写
  1. set a=11
  2. for /l %%i in (1 1 10) do set /a a*=11
复制代码
循环1次就是2个11,循环11次就会是12个11。
作者: CrLf    时间: 2011-7-1 16:42

8# Hello123World


不如把 (1 1 10) 改成 (2 1 11)
作者: 523066680    时间: 2011-7-1 17:01

@echo off
set str=###########
set /a c=%str:#=11*%1
echo %c%
pause


批处理算出的结果好像不对…… 数值超过范围了是不
作者: mxxcgzxxx    时间: 2011-7-1 17:11

本帖最后由 mxxcgzxxx 于 2011-7-1 17:17 编辑

7# ArdentMan

不只是循环12次的原因还有每次都是自己的平方,第一次之后就全错了


将自己的再次简化下
  1. set /a c*=(c*=(c*=(c=11)))*c/11
复制代码

作者: ArdentMan    时间: 2011-7-1 17:16

11# mxxcgzxxx
哦,是的,那要多设置一个变量了,

粗心了~~~~~~~~~~~~~~~
作者: CrLf    时间: 2011-7-1 17:29

本帖最后由 zm900612 于 2011-7-1 17:42 编辑
  1. @echo off
  2. set "n=m*!!8*m*!!7*m*!!6*m*!!5*m*!!4*m*!!3*m*!!2*m*!!1*m"
  3. setlocal enabledelayedexpansion
  4. for /l %%a in (1 1 9) do (
  5. set /a m=%%a,"num=!n:*%%a*=!"
  6. echo !num!
  7. )
  8. pause
复制代码
  1. set m=9
  2. for /f "tokens=%m%* delims=/" %%a in ("1/m/m/m/m/m/m/m/m/1") do set /a "n=m*m*m*m*m*m*m*m*m/%%b"
  3. echo %n%
  4. pause
复制代码
修改了下bug
作者: ArdentMan    时间: 2011-7-1 17:33

版主的思路另类,但好像有点不对吧?
作者: CrLf    时间: 2011-7-1 17:51

刚刚代码没有考虑周全,已经修改。
也可以用单条set写出兼容 1~9 次方的函数,虽然高效,但是写起来太长了...
作者: CrLf    时间: 2011-7-1 18:15

  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (8 -1 0) do (
  3. set /a "tmp=1<<%%a"
  4. set "str=!str!*(^!^!(!tmp!>>m)+^!(!tmp!>>m)*m)"
  5. )
  6. for /l %%a in (1 1 9) do (
  7. set /a m=%%a,"n=!str:~1!"
  8. echo !n!
  9. )
  10. pause
复制代码

作者: ArdentMan    时间: 2011-7-1 20:09

呵呵,版主真的有心了

但是个人感觉这怎么越搞越复杂了

请恕个人理解能力有限
作者: applba    时间: 2011-7-1 20:30

确实越写月复杂。
作者: mxxcgzxxx    时间: 2011-7-1 20:40

本帖最后由 mxxcgzxxx 于 2011-7-1 20:49 编辑

我也想找到通用编码,不过试了下没发现,可能是能力有限或转不过弯来,
你们来找找规律,
本人认为还是把规律放在1,2,3内比较靠谱
比如7=1+2*3=2*2*2-1
能有一个1,2,3的开方规律就好了,看样子要用CALL套
  1. @echo off
  2. :1
  3. set/p p=
  4. :2
  5. ::平方原理
  6. set /a a*=(a=p)
  7. echo %a%
  8. :3
  9. ::3次方
  10. set /a a*=(a=p)*a
  11. echo %a%
  12. :4
  13. ::2次方的平方
  14. set /a a*=(a*=(a=p))
  15. echo %a%
  16. :5
  17. ::2次方的平方+1
  18. set /a a*=(a*=(a=p))*p
  19. echo %a%
  20. :6
  21. ::2次方的3次方
  22. set /a a*=(a*=(a=p))*a
  23. echo %a%
  24. :7
  25. ::4次方的平方-1
  26. set /a a*=(a*=(a*=(a=p)))/p
  27. echo %a%
  28. :8
  29. ::4次方的平方
  30. set /a a*=(a*=(a*=(a=p)))
  31. echo %a%
  32. :9
  33. ::3次方的平方
  34. set /a a*=(a*=(a=p)*a)
  35. echo %a%
  36. pause>nul
  37. :10
  38. ::3次方的平方+1
  39. set /a a*=(a*=(a=p)*a)*p
  40. echo %a%
  41. :11
  42. ::4次方的3次方-1
  43. set /a a*=(a*=(a=p)*a)*a/p
  44. echo %a%
  45. :12
  46. ::4次方的3次方
  47. set /a a*=(a*=(a=p)*a)*a
  48. echo %a%
  49. pause>nul
  50. goto :1
复制代码
另PS:意义本身不大啦,因为算不了多少个数的幂次方,因为批处理的计算能力有限,只是一个思路的练习
作者: CrLf    时间: 2011-7-1 21:01

确实有点复杂,但是我的目的是写成函数,以便节省循环中计算N的N次方时的耗时,所以单次运行时是没有什么优势的
作者: mxxcgzxxx    时间: 2011-7-1 22:46

本帖最后由 mxxcgzxxx 于 2011-7-1 23:26 编辑

只能测试到9所以还不够完善,超出的数太大了无法验证
只要分1,2就行了,原先的1,2,3想法有错,3=2+1
这样就能将规律统一了




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2