标题: [数值计算] [已解决]找出10000以内的所有回文数的批处理代码错在哪里? [打印本页]
作者: 悬崖之树 时间: 2014-7-24 20:25 标题: [已解决]找出10000以内的所有回文数的批处理代码错在哪里?
本帖最后由 悬崖之树 于 2014-7-25 21:06 编辑
- @echo off
-
- setlocal enabledelayedexpansion
-
- for /l %%i in (1 1 10000) do (
- set str=%%i
- set /a n=0
- call :loop
- if !str!==!res! echo %%i
- )
- pause
- :loop
- if "!str:~%n%,1!" neq "" (
- set /a n+=1&goto loop
- )
- for /l %%i in (1 1 %n%) do (
- set "i=-%%i"
- call set res=!res!%%str:~!i!,1%%
- )
复制代码
下面的代码也不行:- @echo off
-
- setlocal enabledelayedexpansion
-
- for /l %%i in (1 1 10000) do (
- set str=%%i
- set /a n=0
- call :loop
- if !str!==!res! echo %%i
- )
- pause
- :loop
- call set t=%%str:~!n!,1%%
- if "!t!" neq "" (
- set res=!t!!res!
- set /a n+=1
- goto loop
- )
复制代码
我的算法是把10000以内的所有的数反写,如果反写后的数和正写的数一样的话,就认为是回文数。
作者: CrLf 时间: 2014-7-24 21:23
因为缺了 set "res=" 呀
作者: CrLf 时间: 2014-7-24 21:35
写完可以看下别人的思路,感觉顶楼代码优化的余地还很大...
举几个例子:
1、与其先生成再判断查找,不如根据规则直接生成
2、已知长度在可容忍范围内时,避免用 loop 计算长度- :loop
- if "!str:~%n%,1!" neq "" (
- set /a n+=1&goto loop
- )
复制代码
可以简化成:- for /l %%a in (9 -1 1) do if "!str:~%%a!"=="" set n=%%a
复制代码
或更高效的:- set list=!str!987654321
- set n=!list:~9,1!
复制代码
3、- set "i=-%%i"
- call set res=!res!%%str:~!i!,1%%
复制代码
这里没必要 set "i=-%%i" 啊,可以简化成:- set res=!res!!str:~-%%i,1!
复制代码
作者: 悬崖之树 时间: 2014-7-24 22:16
回复 3# CrLf
谢谢 crlf 的提醒,让我茅塞顿开啊。
作者: terse 时间: 2014-7-26 00:30
回复 4# 悬崖之树
这个效率提升点- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (1 1 10000) do (
- set str=%%i&set "var=!str:~-1!"
- set "len=%%i543210"
- for /l %%j in (2,1,!len:~5^,1!) do set "var=!var!!str:~-%%j,1!"
- if "%%i" == "!var!" echo,%%i
- )
- pause
复制代码
作者: CrLf 时间: 2014-7-26 03:02
回复 5# terse
其实截一半就好,判断大数字效率提升很明显- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (1 1 100000000) do (
- set str=%%i&set var=!str:~-1!
- set "len=%%i443322111"
- for /l %%j in (2,1,!len:~9^,1!) do set "var=!var!!str:~-%%j,1!"
- for %%j in (!len:~9^,1!) do if "!str:~,%%j!" == "!var!" echo,%%i
- )
- pause
复制代码
话说vbs有原生的 StrReverse,做这个还是很方便的...- For i=1 To 10000
- If StrReverse(i)=CStr(i) Then WScript.Echo i
- Next
复制代码
作者: dengyuli 时间: 2014-7-26 18:12
这是我自己的方法(原创,代码可能不好,但可以找出10000以内的回文数):- @echo off
- setlocal enabledelayedexpansion
- set ctr=0
- set "str="
- :head
- set /a ctr=ctr+1
- set nm=!ctr!
- if !nm! leq 99 goto:head
- if !nm! leq 999 set str=!nm:~2,1!!nm:~1,1!!nm:~0,1!& goto:pd
- if !nm! leq 9999 set str=!nm:~3,1!!nm:~2,1!!nm:~1,1!!nm:~0,1!& goto:pd
- :pd
- if /i asd!str!asd equ asd!nm!asd echo !nm!>>shu.txt
- if !ctr!==10000 exit
- goto:head
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |