Board logo

标题: [数值计算] 【已解决】批处理如何判断一个数是否属于某一等比数列中的一个 [打印本页]

作者: wangshuping42    时间: 2009-5-12 17:09     标题: 【已解决】批处理如何判断一个数是否属于某一等比数列中的一个

如题,如何判断一个数是否属于某一等比数列中的一项?
要求只考虑公比q大于1,且公比、首项都为整数的情况。

设首项a1、公比q都已知

比如数列:已知首项a1=2,公比q=3,求12是否属于该数列

请高手给出代码,谢谢!

有些思路可以参考:
先用该数除以首项,若除不尽,则不属于数列
若能除尽,用除得的结果与公比q比较,若相等,则属于;若小于,则不属于;若大于,则用它再除以公比,用所得结果再与公比比较,如此循环。

[ 本帖最后由 wangshuping42 于 2009-5-16 18:11 编辑 ]
作者: namejm    时间: 2009-5-12 17:50

  是已经知道了这个等比数列中的所有数字,还是只知道首数、尾数和公比?还是其他什么情况?还请楼主给出所有的已知条件,才能写出针对性的代码。
作者: Batcher    时间: 2009-5-12 17:51

建议给出一个等比数列作为例子,请更新到顶楼。
作者: Batcher    时间: 2009-5-12 19:54

你的思路挺好的啊,为何不自己先尝试一下呢?
遇到具体问题再问,这样才有助于提高批处理水平,何必要别人给出现成的代码呢?
作者: wxcute    时间: 2009-5-12 20:11

公比是 3 的比较特殊,呵呵。
除以首项后,各位数字相加是公比 3 的倍数就是,除不尽就不是。
────────────────────────────────────────
2009-05-13:想当然了。     以上说法有误↑

[ 本帖最后由 wxcute 于 2009-5-13 21:03 编辑 ]
作者: wangshuping42    时间: 2009-5-12 22:28

原帖由 Batcher 于 2009-5-12 19:54 发表
你的思路挺好的啊,为何不自己先尝试一下呢?
遇到具体问题再问,这样才有助于提高批处理水平,何必要别人给出现成的代码呢?



思路是简单,写起来很麻烦,因为DOS貌似不支持浮点运算,总是取整数。比如,判断5是否属于首项为1,公比为2的数列中的一项。5除以2,取整得2,等于公比,判断属于该数列,但事实却不属于!!
我真正接触批处理还没一个星期,写了好久都没搞定,实在烦了、晕了,只好求助于各位高手了。
作者: 随风    时间: 2009-5-12 22:52

网上搜了半天,才知道阳世上还有个叫 等比数列 的东东.
不知道我搞懂没有,看以下代码结果对吗?
x 为需判断的数,代码中是18
:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a a1=2,q=3,dbsl=a1,xs=a1,x=18
  3. :loop
  4. (set /a n=a1*q,a1=n
  5. set dbsl=!dbsl! !n!
  6. if !n! lss !x! goto loop
  7. if !n! equ !x! (echo 等比数列 !dbsl!) else (
  8.    echo !x! 不是q为!q!、首项为!xs! 的等比数列中的一项
  9. ))
  10. pause>nul
复制代码

[ 本帖最后由 随风 于 2009-5-12 22:56 编辑 ]
作者: Batcher    时间: 2009-5-12 22:57     标题: 回复 6楼 的帖子

1、首先澄清一个概念,DOS是一个操作系统,CMD才是命令行解释器。你确定自己用的是DOS吗?
2、批处理不能直接支持浮点运算,这一点在教程中写的很清楚,你在顶楼发帖提问是应把这些背景描述清楚。
3、就算接触批处理只有一天,能动手写代码就是很大的进步,大可在顶楼给出自己的代码,让他人指正。
作者: namejm    时间: 2009-5-12 23:11

原帖由 wxcute 于 2009-5-12 20:11 发表
公比是 3 的比较特殊,呵呵。
除以首项后,各位数字相加是公比 3 的倍数就是,除不尽就不是。

这个思路有漏洞,举例:比如30,除以2之后,为15,1+5=6,能被3整除,可是它并不是这个等比数列中的数。实际上,因为等比数列实际上是在累乘公比,单纯用某个数字来除以首项和公比之积,必然会得到错误的结果。
作者: abc001    时间: 2009-5-13 10:31     标题: 我的代码

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p a=请输入首项:
  4. set /p q=请输入公比:
  5. set /p X=请输入要查询的整数:
  6. set t=1
  7. for /L %%i in (1,1,100) do (
  8. set /a t*=!q!
  9. set /a An=!t!*!a!/!q!
  10. rem 100项以内的通项公式
  11. if !An! lss 2147483647 (
  12. set /p =!An!,<NUL
  13. )
  14. if !An! equ !X! (
  15. echo ------!X! 是该数列的第 %%i 项
  16. goto :lop
  17. )
  18. )
  19. echo ------!X! 不是该数列的任意一项.
  20. :lop
  21. pause>nul
复制代码



还是有问题,到后面之后不知道怎么会有递减的现象
作者: inittab    时间: 2009-5-13 10:50

根据等比数列的公式:an=a1*q^(n-1)得出代码:试试是否符合楼主的要求,不考虑公比q为负的情况
  1. @echo off&setlocal enabledelayedexpansion
  2. :begin
  3. set "a1="&set /p a1=请输入首数a1:&if "!a1!"=="" goto :eof
  4. set /p q=请输入公比q:
  5. set /p var=请输入要判断的数:
  6. echo ======================================
  7. set/a a2=a1*q&echo\数列如下:&echo !a1!&echo !a2!
  8. if !a1! equ !var! (echo !var!属于数列第1项&goto begin) else if !a2! equ !var! echo !var!属于数列第2项&goto begin
  9. set q1=%q%
  10. for /l %%a in (3,1,30) do (
  11. set/a q=q*q1,an=a1*q&echo !an!
  12. if !an!==!var! (echo !var!属于数列第%%a项&goto begin) else if !an! gtr !var! (echo !var!不属于此数列&goto begin)
  13. )
复制代码
for /l %%a in (3,1,!var!) 改为 for /l %%a in (3,1,30)

[ 本帖最后由 inittab 于 2009-5-15 09:49 编辑 ]
作者: 随风    时间: 2009-5-13 13:21

因为等比数列实际上是在累乘公比,那么受cmd数字最大范围的限制,
能列出来的等比数列最多应不会超过30个
.
11楼的for /l 中的最大值定为 var 如果这个数很大的话,那么代码运行效率将会是个问题.
  1. @echo off
  2. :loop
  3. setlocal enabledelayedexpansion
  4. set /p a1=请输入首项:
  5. set /p q=请输入公比:
  6. set /p x=请输入要查询的整数:
  7. cls&set /a a2=a1
  8. for /l %%a in (1 1 30) do (
  9.    if !a1! gtr 0 (
  10.       if !a1! neq !x! (set dbsl=!dbsl! !a1!) else set dbsl=!dbsl! ★&set s=a
  11.     )
  12.     set /a a1*=q
  13. )
  14. echo 首项为 !a2! 公比为 !q! 的等比数列为:
  15. echo/!dbsl:~1!&echo/
  16. if defined s (echo/★ !x! 是该数列中的一项)else echo/!x!  不是该数列中的一项
  17. echo/&endlocal&goto :loop
复制代码

[ 本帖最后由 随风 于 2009-5-13 13:35 编辑 ]
作者: inittab    时间: 2009-5-13 15:14

!var!是个像征的值. 找到需要的值后会马上退出for/l 循环., 正如您所说.循环不会超过30次.
如果改为30也是一样的.
作者: 随风    时间: 2009-5-13 15:27     标题: 回复 13楼 的帖子

for 的循环 除了 exit 以外是无法中途退出的,无论是 goto :EOF 还是 goto 标签
只是运行了 goto 后,不在运行 for 中其它的命令而以,
不信,你试试你把值定大点试试?
  1. for /l %%a in (1 1 99999999) do if %%a equ 2 goto end
  2. :end
  3. echo 以退出...
  4. pause
复制代码

作者: Batcher    时间: 2009-5-13 15:31     标题: 回复 13楼 的帖子

for /l 会尝试遍历完所有的可能,它并不会像你想象的那样退出。
作者: inittab    时间: 2009-5-13 22:45

多谢。测试了确实如此。之前还真没注意这个问题。

for /l %%i in (1,1,1000000) do echo %%i&goto :eof

只显示一个1 .
实际是等上一会儿,说明它是循环了1000000次的。
很难理解,难道echo %%i 不参与循环了?请高手指点一下。

[ 本帖最后由 inittab 于 2009-5-13 23:15 编辑 ]
作者: wangshuping42    时间: 2009-5-14 22:19

原帖由 inittab 于 2009-5-13 10:50 发表
根据等比数列的公式:an=a1*q^(n-1)得出代码:试试是否符合楼主的要求,不考虑公比q为负的情况@echo off&setlocal enabledelayedexpansion
:begin
set "a1="&set /p a1=请输入首数a1:&if "!a1!"=="" goto :eof
set ...


代码有误啊,试试首项为1,公比为2,检验8。
作者: inittab    时间: 2009-5-15 09:50

的确,竟然没发现~~ 已改正,多谢!




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