[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

设首项a1、公比q都已知

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

请高手给出代码,谢谢!

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

[ 本帖最后由 wangshuping42 于 2009-5-16 18:11 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

  是已经知道了这个等比数列中的所有数字,还是只知道首数、尾数和公比?还是其他什么情况?还请楼主给出所有的已知条件,才能写出针对性的代码。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

建议给出一个等比数列作为例子,请更新到顶楼。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

你的思路挺好的啊,为何不自己先尝试一下呢?
遇到具体问题再问,这样才有助于提高批处理水平,何必要别人给出现成的代码呢?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

[ 本帖最后由 wxcute 于 2009-5-13 21:03 编辑 ]
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

TOP

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



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

TOP

网上搜了半天,才知道阳世上还有个叫 等比数列 的东东.
不知道我搞懂没有,看以下代码结果对吗?
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 编辑 ]
技术问题请到论坛发帖求助!

TOP

回复 6楼 的帖子

1、首先澄清一个概念,DOS是一个操作系统,CMD才是命令行解释器。你确定自己用的是DOS吗?
2、批处理不能直接支持浮点运算,这一点在教程中写的很清楚,你在顶楼发帖提问是应把这些背景描述清楚。
3、就算接触批处理只有一天,能动手写代码就是很大的进步,大可在顶楼给出自己的代码,让他人指正。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

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

评分人数

    • wxcute: 还真是,错的离谱了。PB + 1
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

我的代码

  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
复制代码



还是有问题,到后面之后不知道怎么会有递减的现象
1

评分人数

TOP

根据等比数列的公式: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 编辑 ]

TOP

因为等比数列实际上是在累乘公比,那么受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 编辑 ]
1

评分人数

技术问题请到论坛发帖求助!

TOP

!var!是个像征的值. 找到需要的值后会马上退出for/l 循环., 正如您所说.循环不会超过30次.
如果改为30也是一样的.

TOP

回复 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
复制代码
技术问题请到论坛发帖求助!

TOP

回复 13楼 的帖子

for /l 会尝试遍历完所有的可能,它并不会像你想象的那样退出。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表