标题: [数值计算] [讨论]如何用最简算式表示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 编辑
- 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个,应该这么写- set a=11
- 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次的原因还有每次都是自己的平方,第一次之后就全错了
将自己的再次简化下- 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 编辑
- @echo off
- set "n=m*!!8*m*!!7*m*!!6*m*!!5*m*!!4*m*!!3*m*!!2*m*!!1*m"
- setlocal enabledelayedexpansion
- for /l %%a in (1 1 9) do (
- set /a m=%%a,"num=!n:*%%a*=!"
- echo !num!
- )
- pause
复制代码
- set m=9
- 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"
- echo %n%
- pause
复制代码
修改了下bug
作者: ArdentMan 时间: 2011-7-1 17:33
版主的思路另类,但好像有点不对吧?
作者: CrLf 时间: 2011-7-1 17:51
刚刚代码没有考虑周全,已经修改。
也可以用单条set写出兼容 1~9 次方的函数,虽然高效,但是写起来太长了...
作者: CrLf 时间: 2011-7-1 18:15
- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (8 -1 0) do (
- set /a "tmp=1<<%%a"
- set "str=!str!*(^!^!(!tmp!>>m)+^!(!tmp!>>m)*m)"
- )
-
- for /l %%a in (1 1 9) do (
- set /a m=%%a,"n=!str:~1!"
- echo !n!
- )
- 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套- @echo off
- :1
- set/p p=
- :2
- ::平方原理
- set /a a*=(a=p)
- echo %a%
- :3
- ::3次方
- set /a a*=(a=p)*a
- echo %a%
- :4
- ::2次方的平方
- set /a a*=(a*=(a=p))
- echo %a%
- :5
- ::2次方的平方+1
- set /a a*=(a*=(a=p))*p
- echo %a%
- :6
- ::2次方的3次方
- set /a a*=(a*=(a=p))*a
- echo %a%
- :7
- ::4次方的平方-1
- set /a a*=(a*=(a*=(a=p)))/p
- echo %a%
- :8
- ::4次方的平方
- set /a a*=(a*=(a*=(a=p)))
- echo %a%
- :9
- ::3次方的平方
- set /a a*=(a*=(a=p)*a)
- echo %a%
- pause>nul
- :10
- ::3次方的平方+1
- set /a a*=(a*=(a=p)*a)*p
- echo %a%
- :11
- ::4次方的3次方-1
- set /a a*=(a*=(a=p)*a)*a/p
- echo %a%
- :12
- ::4次方的3次方
- set /a a*=(a*=(a=p)*a)*a
- echo %a%
- pause>nul
- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |