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

[数值计算] [已解决]找出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以内的所有的数反写,如果反写后的数和正写的数一样的话,就认为是回文数。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
时光荏苒||新陈代谢&&涛声依旧||本性难移

因为缺了 set "res=" 呀
1

评分人数

TOP

写完可以看下别人的思路,感觉顶楼代码优化的余地还很大...
举几个例子:
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!
复制代码

TOP

回复 3# CrLf

谢谢 crlf 的提醒,让我茅塞顿开啊。
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

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

TOP

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

评分人数

TOP

这是我自己的方法(原创,代码可能不好,但可以找出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
复制代码

TOP

返回列表