Board logo

标题: [数值计算] [已解决]找出10000以内的所有回文数的批处理代码错在哪里? [打印本页]

作者: 悬崖之树    时间: 2014-7-24 20:25     标题: [已解决]找出10000以内的所有回文数的批处理代码错在哪里?

本帖最后由 悬崖之树 于 2014-7-25 21:06 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (1 1 10000) do (
  4.    set str=%%i
  5.    set /a n=0
  6.    call :loop
  7.    if !str!==!res! echo %%i   
  8. )
  9. pause
  10. :loop
  11. if "!str:~%n%,1!" neq "" (
  12.    set /a n+=1&goto loop
  13. )
  14. for /l %%i in (1 1 %n%) do (
  15.    set "i=-%%i"
  16.    call set res=!res!%%str:~!i!,1%%
  17. )
复制代码
下面的代码也不行:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (1 1 10000) do (
  4.    set str=%%i
  5.    set /a n=0
  6.    call :loop
  7.    if !str!==!res! echo %%i   
  8. )
  9. pause
  10. :loop
  11. call set t=%%str:~!n!,1%%
  12. if "!t!" neq "" (
  13.    set res=!t!!res!
  14.    set /a n+=1
  15.    goto loop
  16. )
复制代码
我的算法是把10000以内的所有的数反写,如果反写后的数和正写的数一样的话,就认为是回文数。
作者: CrLf    时间: 2014-7-24 21:23

因为缺了 set "res=" 呀
作者: CrLf    时间: 2014-7-24 21:35

写完可以看下别人的思路,感觉顶楼代码优化的余地还很大...
举几个例子:
1、与其先生成再判断查找,不如根据规则直接生成
2、已知长度在可容忍范围内时,避免用 loop 计算长度
  1. :loop
  2. if "!str:~%n%,1!" neq "" (
  3.    set /a n+=1&goto loop
  4. )
复制代码
可以简化成:
  1. for /l %%a in (9 -1 1) do if "!str:~%%a!"=="" set n=%%a
复制代码
或更高效的:
  1. set list=!str!987654321
  2. set n=!list:~9,1!
复制代码
3、
  1.    set "i=-%%i"
  2.    call set res=!res!%%str:~!i!,1%%
复制代码
这里没必要 set "i=-%%i" 啊,可以简化成:
  1.    set res=!res!!str:~-%%i,1!
复制代码

作者: 悬崖之树    时间: 2014-7-24 22:16

回复 3# CrLf

谢谢 crlf 的提醒,让我茅塞顿开啊。
作者: terse    时间: 2014-7-26 00:30

回复 4# 悬崖之树
这个效率提升点
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1 1 10000) do (
  3.     set str=%%i&set "var=!str:~-1!"
  4.     set "len=%%i543210"
  5.     for /l %%j in (2,1,!len:~5^,1!) do set "var=!var!!str:~-%%j,1!"
  6.     if "%%i" == "!var!" echo,%%i
  7. )
  8. pause
复制代码

作者: CrLf    时间: 2014-7-26 03:02

回复 5# terse


其实截一半就好,判断大数字效率提升很明显
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (1 1 100000000) do (
  3.     set str=%%i&set var=!str:~-1!
  4.     set "len=%%i443322111"
  5.     for /l %%j in (2,1,!len:~9^,1!) do set "var=!var!!str:~-%%j,1!"
  6.     for %%j in (!len:~9^,1!) do if "!str:~,%%j!" == "!var!" echo,%%i
  7. )
  8. pause
复制代码
话说vbs有原生的 StrReverse,做这个还是很方便的...
  1. For i=1 To 10000
  2. If StrReverse(i)=CStr(i) Then WScript.Echo i
  3. Next
复制代码

作者: dengyuli    时间: 2014-7-26 18:12

这是我自己的方法(原创,代码可能不好,但可以找出10000以内的回文数):
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set ctr=0
  4. set "str="
  5. :head
  6. set /a ctr=ctr+1
  7. set nm=!ctr!
  8. if !nm! leq 99 goto:head
  9. if !nm! leq 999 set str=!nm:~2,1!!nm:~1,1!!nm:~0,1!& goto:pd
  10. if !nm! leq 9999 set str=!nm:~3,1!!nm:~2,1!!nm:~1,1!!nm:~0,1!& goto:pd
  11. :pd
  12. if /i asd!str!asd equ asd!nm!asd echo !nm!>>shu.txt
  13. if !ctr!==10000 exit
  14. goto:head
复制代码





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