标题: [数值计算] 【已解决】批处理如何判断一个数是否属于某一等比数列中的一个 [打印本页]
作者: 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
:- @echo off&setlocal enabledelayedexpansion
- set /a a1=2,q=3,dbsl=a1,xs=a1,x=18
- :loop
- (set /a n=a1*q,a1=n
- set dbsl=!dbsl! !n!
- if !n! lss !x! goto loop
- if !n! equ !x! (echo 等比数列 !dbsl!) else (
- echo !x! 不是q为!q!、首项为!xs! 的等比数列中的一项
- ))
- 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 标题: 我的代码
- @echo off
- setlocal enabledelayedexpansion
- set /p a=请输入首项:
- set /p q=请输入公比:
- set /p X=请输入要查询的整数:
- set t=1
- for /L %%i in (1,1,100) do (
- set /a t*=!q!
- set /a An=!t!*!a!/!q!
- rem 100项以内的通项公式
- if !An! lss 2147483647 (
- set /p =!An!,<NUL
- )
- if !An! equ !X! (
- echo ------!X! 是该数列的第 %%i 项
- goto :lop
-
- )
- )
- echo ------!X! 不是该数列的任意一项.
- :lop
- pause>nul
复制代码
还是有问题,到后面之后不知道怎么会有递减的现象
作者: 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 /p q=请输入公比q:
- set /p var=请输入要判断的数:
- echo ======================================
- set/a a2=a1*q&echo\数列如下:&echo !a1!&echo !a2!
- if !a1! equ !var! (echo !var!属于数列第1项&goto begin) else if !a2! equ !var! echo !var!属于数列第2项&goto begin
- set q1=%q%
- for /l %%a in (3,1,30) do (
- set/a q=q*q1,an=a1*q&echo !an!
- if !an!==!var! (echo !var!属于数列第%%a项&goto begin) else if !an! gtr !var! (echo !var!不属于此数列&goto begin)
- )
复制代码
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 如果这个数很大的话,那么代码运行效率将会是个问题.- @echo off
- :loop
- setlocal enabledelayedexpansion
- set /p a1=请输入首项:
- set /p q=请输入公比:
- set /p x=请输入要查询的整数:
- cls&set /a a2=a1
- for /l %%a in (1 1 30) do (
- if !a1! gtr 0 (
- if !a1! neq !x! (set dbsl=!dbsl! !a1!) else set dbsl=!dbsl! ★&set s=a
- )
- set /a a1*=q
- )
- echo 首项为 !a2! 公比为 !q! 的等比数列为:
- echo/!dbsl:~1!&echo/
- if defined s (echo/★ !x! 是该数列中的一项)else echo/!x! 不是该数列中的一项
- 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 中其它的命令而以,
不信,你试试你把值定大点试试?- for /l %%a in (1 1 99999999) do if %%a equ 2 goto end
- :end
- echo 以退出...
- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |