标题: 【出题】批处理“解方程” [打印本页]
作者: lxzzr 时间: 2010-4-14 09:11 标题: 【出题】批处理“解方程”
目的:活跃下气氛,最近大家比较闲,无论新手或老手都可以来试试。
一个数的3次方是四位数,4次方是六位数,四位数和六位数又刚好是0-9这几个数字(不重复),求这个数
注:视代码的效率、灵活加分。
[ 本帖最后由 lxzzr 于 2010-4-14 09:13 编辑 ]
作者: 523066680 时间: 2010-4-14 10:42
我记得我猜对过。。。。 现在想不起来了
噢 当时这样想的 3次方算要4位数的话,好像 要有十几才行,马上就抽了一个妙龄岁数:18
然后就对了。
要说明的是,很多“仁”并不是闲,是抽时间来的!
[ 本帖最后由 523066680 于 2010-4-14 10:49 编辑 ]
作者: hanyeguxing 时间: 2010-4-14 15:18
- @echo off
- :hanye
- set/a n+=1,a=n*n*n
- if %a% lss 1000 goto:hanye
- if %a% leq 9999 (setlocal enabledelayedexpansion
- set/a b=n*a&if !b! geq 100000 if !b! leq 999999 (set c=%a%!b!
- for /l %%i in (0,1,9) do set !c:~%%i,1!==
- for /l %%i in (0,1,9) do if not defined %%i set set==
- if not defined set echo.%n%&endlocal)
- goto:hanye)
- pause
复制代码
[ 本帖最后由 hanyeguxing 于 2010-4-14 19:23 编辑 ]
作者: neorobin 时间: 2010-4-14 21:22
- @echo off&setlocal enabledelayedexpansion
- echo %time%&set /a n=9
- :continue
- set /a n+=1,cube=n*n*n,biq=cube*n & set "comb=!cube!!biq!"
- if "!comb:~9,1!" equ "" goto :continue
- if "!comb:~10,1!" equ "" ( setlocal enabledelayedexpansion
- for /l %%i in (0,1,9) do set "!comb:~%%i,1!=Y"
- if "!1!!2!!3!!4!!5!!6!!7!!8!!9!!0!"=="YYYYYYYYYY" echo !n!的3次方=!cube!, !n!的4次方=!biq!
- endlocal
- ) else goto :break
- goto :continue
- :break
- echo 求解结束&echo %time%&pause
复制代码
[ 本帖最后由 neorobin 于 2010-4-14 21:38 编辑 ]
作者: x9tiancmd 时间: 2010-4-14 21:24
(GNU兄台不好意思, 把您的名字打错了现在解正过来了 , 我是流览器开两页面, 不同主题, 一个主题是你的回复(在二楼) 刚才一下点错了鼠标,写上了你的大名,汗( ̄口 ̄)!! ,其实我是说本贴三楼兄台, (看错了贴子还由之可,不但把三楼看成二楼了,把楼层人名搞错了(搞错了还写错), 最搞笑的是打分也打错了○( ̄﹏ ̄)○,,看来刚才打CF打得有点头晕了,嗯睡觉去, 哎天大的笑话,让楼下见笑了)
后面的判断 四位数,六位数, 有无重复有点不同
set/a b=n*a&if !b! geq 100000 if !b! leq 999999 (echo.%a%!b!|find"0"|find "1"|find "2"| find .... >nul&&echo.%n%) else (echo.题目无解)
晕评分点错了人, 因当是评在三楼楼 兄上面, 一下点错了.╮( ̄﹏ ̄)╭
[ 本帖最后由 x9tiancmd 于 2010-4-14 21:45 编辑 ]
作者: GNU 时间: 2010-4-14 21:32 标题: 回复 5楼 的帖子
问一下GUN是谁啊?
作者: 523066680 时间: 2010-4-14 21:51
扭曲一下
是从普通的思想出发的,10位数,从0-9 ,
如果中间有重复的话,必然有一个数字不存在。
刚好是要求10位中有10个不同的数,累计他们是否全部出现过即可。
借用了nerobin的代码体- @echo off&setlocal enabledelayedexpansion
- echo %time%&set /a n=9
- :continue
- set /a n+=1,cube=n*n*n,biquadrate=cube*n,num=0
- set "combination=!cube!!biquadrate!"
- if "!combination:~9,1!" equ "" goto :continue
- if "!combination:~10,1!" neq "" goto :break
- for /l %%a in (0,1,9) do (if not "!combination:%%a=!"=="!combination!" (set /a num+=1))
- if %num% equ 10 (echo %n% _ %combination%)
- :break
- echo 求解结束&echo %time%&pause
复制代码
[ 本帖最后由 523066680 于 2010-4-14 21:57 编辑 ]
作者: hanyeguxing 时间: 2010-4-14 22:01
个人认为set n=9不适合写在批处理里,这样失去了求解的意义
那不如直接开始就for /l %%i in (10,1,21) do...了
[ 本帖最后由 hanyeguxing 于 2010-4-14 22:05 编辑 ]
作者: 523066680 时间: 2010-4-14 22:06 标题: 回复 8楼 的帖子
有点道理的,不过还行吧。
nerobin的位数判断部分很严密啊。1 到 9 就是多9个判断+跳转。
不过我还这样认为,0*0*0 ,1*1*1 ,2*2*2,3*3*3 不能构成4位数,是一件明显的事情
于是思想中跳跃地推到10*10*10 刚好到4位,也很明显啊
[ 本帖最后由 523066680 于 2010-4-14 22:09 编辑 ]
作者: hanyeguxing 时间: 2010-4-14 22:15
原帖由 523066680 于 2010-4-14 22:06 发表
有点道理的,不过还行吧。
nerobin的位数判断部分很严密啊。1 到 9 就是多9个判断+跳转。
不过我还这样认为,0*0*0 ,1*1*1 ,2*2*2,3*3*3 不能构成4位数,是一件明显的事情
于是思想中跳跃地推到10*10*10 刚好 ...
我们不适合用自己的熟悉运算结果来替代批处理的运算过程,个人观点而已。
作者: lxzzr 时间: 2010-4-14 22:17
10 的3次方是1000,既然这个数的三次方是四为位,那么他它一定大于10咯....
现在的方法都是“穷举法”,有没有不用“穷举法”的???
[ 本帖最后由 lxzzr 于 2010-4-14 22:19 编辑 ]
作者: 523066680 时间: 2010-4-14 22:24 标题: 回复 11楼 的帖子
寒月孤星的观点跟batman的一致哦~
关于“现在的方法都是“穷举法”,有没有不用“穷举法”的???”
有,我2楼那个用猜的,18是一个非常#@¥!…… 的数字
作者: lxzzr 时间: 2010-4-14 22:28 标题: 回复 12楼 的帖子
汗,说不过你....
作者: 523066680 时间: 2010-4-14 22:30 标题: 回复 13楼 的帖子
说真的 我也很期待一个非穷举的思路
看到的话一定加分+加技术+膜拜一下
作者: hanyeguxing 时间: 2010-4-14 22:56
因为 n 的3次方为4位数,所以 n 的范围为10到21
因为 n 的4次方为6位数,所以 n 的范围为18到31
所以 n 的交集范围为18到21
尾数为0、1、5、6的数字,其3次方与4次方尾数全相同,所以排除20、21,剩余18、19。
因为20的4次方为160000,所以19的4次方首位为1,又因为19的尾数为9,其4次方的尾数也为1,重复,所以这个数字只能是18。。。。。。好象没批处理什么事了,闪,免得挨砖头,嘿嘿
[ 本帖最后由 hanyeguxing 于 2010-4-14 23:29 编辑 ]
作者: neorobin 时间: 2010-4-14 23:01 标题: 回复 15楼 的帖子
原帖由 hanyeguxing 于 2010-4-14 22:56 发表
因为 n 的3次方为4位数,所以 n 的范围为10到21
因为 n 的4次方为6位数,所以 n 的范围为18到31
所以 n 的交集范围为18到21
尾数为0、1、5的数字,其3次方与4次方尾数全相同,所以排除20、21,剩余18、19。
因为 ...
哈哈, 确实用推导就出来了, 补充一下, 个位为 0,1,5,6 的任意次方个位总不变, 都排除.
当然, [10到21], [18到31] 这两个区间的界限到是可以用开方(也要非穷举的好算法)的批处理来求得, 排除 0,1,5,6 这样明显的问题这不必写代码来推导了, 之后变成在一个更小的范围内做一个更有限的穷举来解
PS: 穷举也不是彻底不可用, 当穷举元素数量总是少得达到可以接受的程度, 往往那样的列举只是没在意罢了, 实质上也还是穷举, 比如从 1 循环到 2
[ 本帖最后由 neorobin 于 2010-4-14 23:19 编辑 ]
作者: hanyeguxing 时间: 2010-4-14 23:34
穷举累的是机器,又不是我,我不心疼,嘿嘿。。。有版聊之嫌,闪。。。
作者: 523066680 时间: 2010-4-15 08:47 标题: 回复 17楼 的帖子
一个帖子下也不能全是代码啦~
个人感觉这次解题过程比较精彩的(是人为解题部分 哈哈)。
作者: ljfnh403 时间: 2012-3-11 11:41
[code]
@echo off&setlocal EnableDelayedExpansion
for /l %%a in (-100,1,100) do (set/a _3=%%a*%%a*%%a,_4=_3*%%a
if "!_3:~4,1!"=="" if not "!_3:~3,1!"=="" if "!_4:~6,1!"=="" if not "!_4:~5,1!"=="" (set stx=0123456789
for %%d in (3,4) do for /l %%b in (0,1,5) do set _0=!_%%d:~%%b,1!&for %%c in (!_0!) do set stx=!stx:%%c=!
if not defined stx echo %%a))
pause>nul
[/cdde]
作者: ljfnh403 时间: 2012-3-11 11:41
- @echo off&setlocal EnableDelayedExpansion
- for /l %%a in (-100,1,100) do (set/a _3=%%a*%%a*%%a,_4=_3*%%a
- if "!_3:~4,1!"=="" if not "!_3:~3,1!"=="" if "!_4:~6,1!"=="" if not "!_4:~5,1!"=="" (set stx=0123456789
- for %%d in (3,4) do for /l %%b in (0,1,5) do set _0=!_%%d:~%%b,1!&for %%c in (!_0!) do set stx=!stx:%%c=!
- if not defined stx echo %%a))
- pause>nul
复制代码
作者: ljfnh403 时间: 2012-3-11 16:50
- @echo off&setlocal EnableDelayedExpansion
- for /l %%a in (-100,1,100) do (set/a _3=%%a*%%a*%%a,_4=_3*%%a
- if "!_3:~4,1!"=="" if not "!_3:~3,1!"=="" if "!_4:~6,1!"=="" if not "!_4:~5,1!"=="" (set stx=0123456789
- for %%d in (3,4) do for /l %%b in (0,1,5) do set _0=!_%%d:~%%b,1!&for %%c in (!_0!) do set stx=!stx:%%c=!
- if not defined stx echo %%a))
- pause>nul
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |