找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 30796|回复: 6

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

[复制链接]
发表于 2014-7-24 20:25:07 | 显示全部楼层 |阅读模式
本帖最后由 悬崖之树 于 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以内的所有的数反写,如果反写后的数和正写的数一样的话,就认为是回文数。

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2014-7-24 21:23:53 | 显示全部楼层
因为缺了 set "res=" 呀

评分

参与人数 1技术 +1 收起 理由
悬崖之树 + 1 乐于助人 技术精湛

查看全部评分

发表于 2014-7-24 21:35:45 | 显示全部楼层
写完可以看下别人的思路,感觉顶楼代码优化的余地还很大...
举几个例子:
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:43 | 显示全部楼层
回复 3# CrLf

谢谢 crlf 的提醒,让我茅塞顿开啊。
发表于 2014-7-26 00:30:35 | 显示全部楼层
回复 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
复制代码
发表于 2014-7-26 03:02:18 | 显示全部楼层
回复 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技术 +2 收起 理由
xxpinqz + 1 厉害啊
terse + 1 思路决定效率,

查看全部评分

发表于 2014-7-26 18:12:14 | 显示全部楼层
这是我自己的方法(原创,代码可能不好,但可以找出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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 11:00 , Processed in 0.022088 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表