Board logo

标题: 批处理列出1000以内回文数 [打印本页]

作者: wxcute    时间: 2008-9-17 21:34     标题: 批处理列出1000以内回文数

[新手练功区的新手跟帖不多,可能是因为题目太难了。各位等等新手两天再回答好了。]
我国古代有一种回文诗,倒念顺念都有意思,例如“人过大佛寺”,倒读起来便是“寺佛大过人”。还有经典的对联“客上天然居,居然天上客”。此种例子举不胜举。

从左向右读与从右向左读完全一样的数字就是回文数,如11、121、767等等。
作者: pusofalse    时间: 2008-9-17 21:43

经典!以前做过一个找出10000以内的回文数的题目,都一样。就是不知131 464 15751
这样的是不是回文数。
作者: wxcute    时间: 2008-9-17 22:05

对阿,就是这样的。

10000太多了,少点给人在感觉上压力不会太大。
作者: wwjpl    时间: 2008-9-18 09:36

"上海自来水来自海上"

正念倒念都一样,算不算回文?
作者: batman    时间: 2008-9-18 10:37

看来新手们是不想解答此题,本人先来抛个“砖”吧,期待“玉”的出现:
  1. @echo off
  2. for /l %%i in (11,1,999) do set "str=%%i"&call :lp %%i
  3. pause>nul
  4. :lp
  5. set "a=%a%%str:~,1%"&set "b=%b%%str:~-1%"
  6. set "str=%str:~1,-1%"
  7. if defined str goto lp
  8. if %a% equ %b% echo %1
  9. set "a="&set "b="
复制代码

作者: youxi01    时间: 2008-9-18 12:36

楼上效率必然不高
其实可以观察回文数的特点:左右两边对称
巧妙的方法可以直接通过for即可,数秒内就可找出10000以内所有的回文数
作者: batman    时间: 2008-9-18 12:46

原帖由 youxi01 于 2008-9-18 12:36 发表
楼上效率必然不高
其实可以观察回文数的特点:左右两边对称
巧妙的方法可以直接通过for即可,数秒内就可找出10000以内所有的回文数

楼上说是的即是,本人也是用这种多层循环的方法解的,之所以没有贴出来,是想引其他人来把这块玉献出来。。。

[ 本帖最后由 batman 于 2008-9-18 12:48 编辑 ]
作者: youxi01    时间: 2008-9-18 12:46

当然楼上的思路是投机取巧的办法,不是真正意义上的检测 回文数,纯粹是列出
作者: youxi01    时间: 2008-9-18 12:53

测试代码:
  1. @echo off
  2. for /l %%i in (1 1 9) do (
  3. echo %%i%%i
  4. set/a n+=1
  5. for /l %%j in (0 1 9) do (
  6.   echo %%i%%j%%i
  7.   echo %%i%%j%%j%%i
  8.   set/a n+=2
  9.   )
  10. )
  11. echo 10000以内总共有回文数%n%个
  12. pause>nul
复制代码
不过考虑全了没有,我就不知道了
作者: youxi01    时间: 2008-9-18 13:03

楼上的还有些不全:四位数的不见了
还有一些4004,404之类

我的代码稍微加入了统计回文数个数...
作者: lovelymorning    时间: 2008-9-18 16:43

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (11,1,999) do (
  4. set a=%%i
  5. if "!a:~0,1!"=="!a:~-1!" echo %%i
  6. )
  7. pause
复制代码


献丑了。。。
作者: z_berry    时间: 2008-9-23 13:20

0,1,2,3,4,5,6,7,8,9不算吗?

原帖由 youxi01 于 2008-9-18 12:53 发表
测试代码:@echo off
echo 0set n=1for /l %%i in (1 1 9) do (
echo %%i
echo %%i%%i
set/a n+=2
for /l %%j in (0 1 9) do (
  echo %%i%%j%%i
  echo %%i%%j%%j%%i
  set/a n+=2
  )
)
echo 10000以内总共有回文数%n%个
paus ...

[ 本帖最后由 z_berry 于 2008-9-23 13:21 编辑 ]
作者: wxcute    时间: 2008-10-2 17:44

这是我的不严谨之处。
我自己也不大清楚。
如果单个数也是的话,就要从 0 开始循环了。
作者: h5599859    时间: 2008-10-6 12:11

请问9楼的你代码中的set /a n+=1和set /a n+=2这两个在这段代码中各表示什么意思啊
作者: wxcute    时间: 2008-10-8 19:09

回 14 楼

set /a n+=1 等同于 set /a n=n+1
set /a n+=2 等同于 set /a n=n+2
作者: qq641255849    时间: 2008-10-9 13:20

  1. @echo off
  2. for /l %%a in (11,1,999) do (set str=%%a&call :a)
  3. pause
  4. :a
  5. set n3=%str:~0,1%
  6. set n2=%str:~1,1%
  7. set n1=%str:~2,1%
  8. if "%n1%" equ "" (set rts=%n2%%n3%) else (set rts=%n1%%n2%%n3%)
  9. if %rts% equ %str% (echo %str%)
  10. goto :eof
复制代码
上学时想的..
作者: stu_light    时间: 2008-10-15 23:09

小第不才 只能顶上去.
作者: zqy    时间: 2008-10-30 20:44

  1. @echo off
  2. for /l %%i in (1 1 9) do (
  3. echo %%i%%i
  4. for /l %%j in (0 1 9) do (
  5. echo %%i%%j%%i
  6. )
  7. )
  8. pause>nul
复制代码
参照youxi01的方法,自己写的.
作者: zqy    时间: 2008-10-30 20:46     标题: 回复 16楼 的帖子

你的效率明显的低于我的效率..
作者: keen    时间: 2009-4-2 22:38

  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (0 1 1000) do (
  3.     set a=%%i
  4.     if "!a:~0,1!"=="!a:~-1,1!" echo !a!
  5. )
  6. pause
复制代码

[ 本帖最后由 keen 于 2009-4-2 22:39 编辑 ]
作者: keen    时间: 2009-4-2 23:14

来个10000以内的回文数:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (0 1 1000) do (
  3.     set a=%%i
  4.     if "!a:~0,1!"=="!a:~-1,1!" echo !a!
  5. )
  6. for /l %%i in (1001 1 10000) do (
  7.     set a=%%i
  8.     if "!a:~0,1!"=="!a:~-1,1!" if "!a:~1,1!"=="!a:~-2,1!" echo !a!
  9. )
  10. pause
复制代码
其实是在1000以内的多加几行。
作者: keen    时间: 2009-4-2 23:30

简洁10000以内的回文数:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (0 1 10000) do (
  3.     set a=%%i
  4.     if "!a:~0,1!"=="!a:~-1,1!" if !a! lss 1000 (echo !a!) else (if "!a:~1,1!"=="!a:~-2,1!" echo !a!)
  5. )
  6. pause
复制代码

作者: cainiao736    时间: 2009-4-4 16:32

  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in ( 10,1,999 ) do (
  3. set str=%%i
  4. set a=!str:~0,1!
  5. set b=!str:~-1,1!
  6. if "!a!"=="!b!" echo %%i)
  7. pause
复制代码



10000以内的
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (10,1,10000) do (
  3. set str=%%i
  4. set a=!str:~0,1!
  5. set b=!str:~-1,1!
  6. set c=!str:~1,1!
  7. set d=!str:~-2,1!
  8. if "!a!"=="!b!" ( if "!c!"=="!d!" echo !str!))
  9. pause
复制代码

[ 本帖最后由 cainiao736 于 2009-4-4 16:45 编辑 ]
作者: sjzong    时间: 2009-4-26 21:52     标题: 我也试试

这个问题如果是每一个数去判断的话,那效率是低点,但是这样求出的数是有顺序的!
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (1 2 3 4 5 6 7 8 9) do (
  4. rem 以下两句是求两位的回文数
  5. echo %%a%%a
  6. set/a num+=1
  7. for %%b in (0 1 2 3 4 5 6 7 8 9) do (
  8. rem 以下两句是求三位的回文数
  9.   echo %%a%%b%%a
  10.   set/a num+=1
  11. rem 以下两句是求四位的回文数
  12.   echo %%a%%b%%b%%a
  13.   set/a num+=1
  14. )
  15. )
  16. echo 10000以内回文数共有!num!
  17. pause
复制代码

作者: lxzzr    时间: 2009-4-27 02:15     标题: 100到10000000以内的回文数

100以内的就不去“数”了。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (100,1,10000000) do (
  3. set a=%%a
  4. if "!a:~0,1!" == "!a:~-1,1!" (
  5. if "!a:~1,1!" == "!a:~-2,1!" (
  6. if "!a:~2,1!" == "!a:~-3,1!" (
  7. echo !a!
  8. ))))
  9. pause
复制代码

作者: scarcr    时间: 2011-8-4 18:24

回复 1# wxcute
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (10 1 999) do (
  4. set "a=%%i"
  5. if "!a:~,1!" equ "!a:~-1!" (echo !a!)
  6. )
  7. pause
复制代码

作者: PCL505512957    时间: 2011-8-18 00:04

  1. @if not defined debug @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1 1 1000) do (
  3.     set /a a=%%i/100
  4.     set /a b=%%i/10-!a!*10
  5.     set /a c=%%i-!a!*100-!b!*10
  6.     if !c! equ !a! (if not !a! equ 0 echo %%i)
  7. )
  8. pause >nul
复制代码

作者: mxxcgzxxx    时间: 2011-8-18 07:50

本帖最后由 mxxcgzxxx 于 2011-8-18 08:09 编辑

给个新思路,100000以内回文数
怎么就没人想出这个方案呢??很容易啊
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in  (1 1 99) do (
  4.          set /a a=%%i/10+%%i%%10*10+100
  5.          if !a:~-1!==0 (set a=!a:~-2,1!) else (set a=!a:~-2!)
  6.          echo %%i!a!
  7.          for /l %%j in (0 1 9) do echo %%i%%j!a!
  8.          pause>nul
  9.          )
  10. set /a b=99*11
  11. echo 100000以内有%b%个回文数
  12. pause>nul
复制代码

作者: 悬崖之树    时间: 2013-2-5 22:50

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (0,1,1200) do (
  4.      set a=%%i
  5.      if "!a:~0,1!"=="!a:~-1!"  (
  6.        if "!a:~1,1!"=="" (
  7.          echo !a!>>1.txt
  8.        ) else (
  9.                 if "!a:~1,1!"=="!a:~-2,1!" (
  10.                   if "!a:~3,1!"=="" (
  11.                     echo !a!>>1.txt
  12.                   ) else echo 你的数太大啦!&goto  out
  13.                 )
  14.          )
  15.      )
  16. )
  17. :out
  18. pause
复制代码

作者: 悬崖之树    时间: 2013-2-6 20:53

回复 29# 悬崖之树
这个代码有问题,并不是只要测试到六位数就提示“你输入的数太大了”,而是要到类似 “124521” 之类的六位数才会提示。下面是改进后的
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. if exist 1.txt del 1.txt
  4. :ks
  5. set /p num=请输入一个最多5位的正整数:
  6. if %num% gtr 999999 echo 你的数太大了,请重新输入!& goto ks
  7. for /l %%i in (0,1,%num%) do (
  8.      set a=%%i
  9.      if "!a:~0,1!"=="!a:~-1!"  (
  10.        if "!a:~3,1!"=="" (
  11.          echo !a!>>1.txt
  12.        ) else (
  13.                 if "!a:~1,1!"=="!a:~-2,1!" (
  14.                   if "!a:~5,1!"=="" (
  15.                     echo !a!>>1.txt
  16.                   )
  17.                 )
  18.          )
  19.      )
  20. )
  21. echo 结果已经保存在当前目录下的1.txt文件中
  22. pause
复制代码

作者: zqy220422    时间: 2014-11-14 09:45

你们是怎么样炼成的啊
作者: shelluserwlb    时间: 2014-11-20 09:27

本帖最后由 shelluserwlb 于 2014-11-20 09:40 编辑
  1. @echo off
  2. goto :START
  3. 我国古代有一种回文诗,倒念顺念都有意思,例如“人过大佛寺”,倒读起来便是“寺佛大过人”。还
  4. 有经典的对联“客上天然居,居然天上客”。此种例子举不胜举。
  5. 从左向右读与从右向左读完全一样的数字就是回文数,如11、121、767等等。
  6. :START
  7. MODE CON LINES=200
  8. setlocal enabledelayedexpansion
  9. set /a total=0
  10. for /l %%i in (11,1,10000) do (
  11.     set num=%%i
  12.     :: 判断小于1000的数字
  13.     if !num! lss 1000  (
  14. if "!num:~0,1!"=="!num:~-1,1!" (
  15.     echo !num! & set /a total+=1  
  16. )
  17.     )
  18.    ::判断大于等于1000且小于10000的数字
  19.    if !num! geq 1000  ( if !num! lss 10000 (
  20. if "!num:~0,1!"=="!num:~-1,1!" ( if "!num:~1,1!"=="!num:~2,1!" (
  21.     echo !num! & set /a total+=1
  22.         ))
  23.     ))
  24. )
  25. echo 一万以内总共有%total%个回文件数。
  26. endlocal & pause>NUL
复制代码
上述是找出10000以内的回文数的批处理代码。
作者: shelluserwlb    时间: 2014-12-6 23:45

本帖最后由 shelluserwlb 于 2014-12-6 23:53 编辑

参照18楼的代码,改了一下,按从小到大的顺序显示1000以内的回文数(1个数字不能算回文数)。
  1. @echo off
  2. for /l %%i in (1,1,9) do echo %%i%%i
  3. for /l %%i in (1,1,9) do (
  4.     for /l %%j in (0,1,9) do (
  5. echo %%i%%j%%i
  6.     )
  7. )
  8. pause
复制代码

作者: shelluserwlb    时间: 2014-12-7 00:20

参照9楼的代码,按从小到大的顺序完全列出10000以内的回文数
(效率应该不会差到哪里去的。)
  1. @echo off
  2. set /a total=9
  3. for /l %%i in (1,1,9) do echo %%i%%i
  4. for /l %%i in (1,1,9) do (
  5.     for /l %%j in (0,1,9) do (
  6. echo %%i%%j%%i
  7.         set /a total+=1
  8.     )
  9. )
  10. for /l %%i in (1,1,9) do (
  11.     for /l %%j in (0,1,9) do (
  12.         echo %%i%%j%%j%%i
  13.         set /a total+=1
  14.     )
  15. )
  16. echo 一万以内共有%total%个回文数!
  17. pause>nul
复制代码





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