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

【排除12345】谢谢关注
01 02 03 04 06
01 02 03 04 07
01 02 03 04 08
01  ...
ads350668398 发表于 2019-5-4 23:24


我用A.B.C.D.E比喻五段數組
例如:
01 02 03 04 07
01=strA ,02=strB , 03=strC , 04=strD , 07=strE

如果數組排序的邏輯必然是 : E大於D , D大於C , C大於B , B大於A的話 (沒有[相同數目]、或者[負數]) , 那你 set /a nub=!E!-!D!-!C!-!B!-!A!   , 接著if "!nub!=4" echo yes , 如果是連續數目 , 減下去!nub!就必然是4了 , 否則!nub!就不是連續數目。

這樣沒了迴圈、效率就應較快了
=======================
偶数、 奇数
取str的最後一位數字、補上一個0、再除2 ; 答案最尾一位不是0就是奇数 , 否則是偶数

整除3也一樣 , 在str後補上一個0(原理是把他當成小數點後的位)、再除3 , 答案最尾一位不是0就不能整除 , 否則是能整除(原理是 , 不能整除才會出現小數點)
整除5 , 同上

!str:~-1,1!     顯示最後一個字的寫法
!str:~0,-1!    去掉最後一個字的寫法


路過 , 邊看邊答 , 就不寫代碼了 , 只幫忙想想思路上迴圈最少的方法
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

易讀版:
  1. @echo off&setlocal enabledelayedexpansion
  2. del testinbathome.txt 2>nul>nul
  3. for /f "tokens=1,2,3,4,5 delims= " %%a in (1.txt) do (
  4.      set ORG=%%a %%b %%c %%d %%e
  5.      for  %%f in (!ORG!) do (
  6.           set /a looptime+=1
  7. ::去除字串左前的所有0
  8.           set /a var!looptime!=-11%%f+10%%f+1%%f
  9.      )
  10.      call :step !var1! !var2! !var3! !var4! !var5!
  11.      set looptime=
  12. )>>testinbathome.txt
  13. start testinbathome.txt
  14. <
  15. :step
  16. ::判斷是否順數 , 非順數才繼續嘗試整除
  17. set str=set/a nub=%5-%4+%4-%3+%3-%2+%2-%1
  18. for /f  %%i in ('!str!') do (
  19.      set /p=!ORG!  <nul
  20.      if "%%i" EQU "4" (
  21.           echo 連續的字串
  22.      ) else (
  23.           ::非連續的字串
  24.           call :step2 !var1! !var2! !var3! !var4! !var5!
  25.      )
  26.      goto :eof
  27. )
  28. :step2
  29. ::判斷數字能否全為2-9之倍數 , 和判斷奇偶數
  30. set str=%10 %20 %30 %40 %50
  31. ::for語句[2,3,5,9] 可切換成 [2,3,4,5,6,7,8,9] , 則變成判繼2至9的所有倍數
  32.      for %%Z in (2,3,5,9) do (
  33.      call :step3 %%Z
  34.      if "!about%%Z!" EQU "00000" (
  35.           set /p=整除於[%%Z]<nul
  36.           if "%%Z"=="2" (set /p=, 偶數字串 , <nul)
  37.           )else if "!about%%Z!%%Z" == "555552"  (set /p=奇數字串<nul))
  38.      )
  39. echo.
  40. goto :eof
  41. )
  42. :step3
  43. ::數字2-9通用的整除計算語句
  44.      for /f "tokens=1,2,3,4,5 delims= " %%i in ('echo !str!') do set/a A=%%i/%1 ,B=%%j/%1,C=%%k/%1,D=%%m/%1,E=%%l/%1&&set about%1=!A:~-1,1!!B:~-1,1!!C:~-1,1!!D:~-1,1!!E:~-1,1!
复制代码
精簡版:
  1. @echo off&setlocal enabledelayedexpansion
  2. del testinbathome.txt 2>nul>nul
  3. for /f "tokens=1,2,3,4,5 delims= " %%a in (1.txt) do (
  4.      set ORG=%%a %%b %%c %%d %%e
  5.      for  %%f in (!ORG!) do set /a looptime+=1&&set /a var!looptime!=-11%%f+10%%f+1%%f
  6.      set/a str=!var5!-!var4!+!var4!-!var3!+!var3!-!var2!+!var2!-!var1!
  7.      set /p=!ORG!  <nul
  8.      if "!str!" EQU "4" set /p=連續的字串<nul
  9.      for %%Z in [color=Red](2,3,4,5,6,7,8,9)[/color] do (
  10.           set/a A=!var1!0/%%Z ,B=!var2!0/%%Z,C=!var3!0/%%Z,D=!var5!0/%%Z,E=!var5!0/%%Z
  11.           set about%%Z=!A:~-1,1!!B:~-1,1!!C:~-1,1!!D:~-1,1!!E:~-1,1!
  12.           if "!about%%Z!%%Z" == "555552" set mark=1&&set /p=奇數字串<nul
  13.           if "!about%%Z!" EQU "00000" (
  14.                if "%%Z"=="2" (
  15.                     set mark=2&set /p=偶數字串 , [%%Z]<nul
  16.                ) else (
  17.                     if !mark!==1 set /p=, <nul
  18.                     set mark=2&set /p=[%%Z]<nul
  19.                )
  20.           )
  21.           if !mark!9==2%%Z set /p=之倍數<nul
  22.      )
  23. echo.
  24. set looptime=&set mark=0
  25. )>>testinbathome.txt
  26. start testinbathome.txt
复制代码
測試文件[1.txt]
  1. 01 02 03 04 05
  2. 01 02 03 04 06
  3. 01 02 03 04 07
  4. 01 02 03 04 08
  5. 01 02 03 04 09
  6. 01 02 03 04 10
  7. 01 02 03 04 11
  8. 02 03 04 05 06
  9. 02 04 06 08 10
  10. 03 06 09 12 15
  11. 01 03 05 07 09
  12. 05 10 15 20 25
  13. 06 09 15 27 33
  14. 01 04 07 10 13
  15. 01 05 09 13 17
  16. 01 06 11 16 21
  17. 01 07 13 19 25
  18. 01 08 15 22 29
  19. 01 09 18 26 34
  20. 03 11 15 21 23
  21. 06 10 18 22 28
  22. 04 06 08 10 12
  23. 06 07 08 09 10
  24. 23 24 25 26 27
  25. 06 10 20 22 28
  26. 28 29 30 31 32
  27. 09 18 27 36 99
  28. 099 0117 0234 0594 07992
  29. 0090 0099 0909 0594 07992
  30. 02889 2898 02997 03789 04293
  31. 0029 030 00031 32 033
  32. 29 00030 031 00000032 0033
  33. 2 0000004 006 00008 10
  34. 550 00660 000770 880 0990
  35. 33 39 63 69 99
  36. 44 88 124 164 204
  37. 40 80 120 160 200
  38. 06 12 18 24 30
  39. 07 14 21 28 35
  40. 08 16 24 32 40
  41. 01 03 06 07 09
  42. 09 18 27 36 99
复制代码
我把他直接寫成可分類 : 奇數、偶數、順序字串、和分辨[1-9]的倍數
另外因不肯定你只是用來處理2位數組 , 也不肯定數目前必然只有1個零 , 所以也把它寫成可以通用處理[測試文件]那些古怪格式了
另外也因不肯定你只是用來處理[3]和[5]的倍數 , 所以也把它寫成可以通用分辨[1-9]的倍數。如果需要改回只處理3和5的倍數 , 你可把[精簡版:](2,3,4,5,6,7,8,9) 一句改成(2,3,5)就可以了

第一個[易讀版:]的代碼是方便你讀和修改的 , 所以盡量把運作分類和每部份寫註解了。如果你想增加判斷字串方法 , 應該你再增加 標籤/算式 , 再call這標籤就成了
1

评分人数

带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

本帖最后由 Taurus 于 2019-6-7 03:45 编辑

精簡化#24樓代碼 , 以及按8樓要求改為過濾[1~9]、奇偶數、順序數
優化不必要的迴圈至最少
同樣 , 只要把[for %%Z in (2,3,4,5,6,7,8,9) do (] 改為[for %%Z in (2,3,5) do (] 則只過濾2、3、5倍數 , 現在是判斷過濾1-9的
@echo off&setlocal enabledelayedexpansion
del test.txt>nul 2>nul
for /f "tokens=1-5 delims= " %%a in (1.txt) do (
    for  %%f in (%%a %%b %%c %%d %%e) do set/a loop+=1&&set/a var!loop!=-11%%f+10%%f+1%%f
    set/a str=!var5!-!var4!+!var4!-!var3!+!var3!-!var2!+!var2!-!var1!,loop=0
    if "!str!" NEQ "4" call :a %%a %%b %%c %%d %%e
)
test.txt
:a
for %%Z in (2,3,4,5,6,7,8,9) do (
    set/a A=!var1!0/%%Z,B=!var2!0/%%Z,C=!var3!0/%%Z,D=!var4!0/%%Z,E=!var5!0/%%Z
    if "!A:~-1,1!!B:~-1,1!!C:~-1,1!!D:~-1,1!!E:~-1,1!" == "00000" goto :eof
    if "!A:~-1,1!!B:~-1,1!!C:~-1,1!!D:~-1,1!!E:~-1,1!%%Z" == "555552" goto :eof
)
echo %*>>test.txt

註解:
第四行 : 去字串前的[0]的算式 , 原理為 , 把[009090]加上兩個位 ,  -11009090+10009090+1009090=[9090]
算式為-11[string]+-10[string]-1[string]=[Result]

第五行 : 去除[連續數]的算式 , 原理為 , 例如連續數[5,6,7,8,9] , 把9-8+8-7+7-6+6-5=[4] ; 只要是[連續數] , 餘值必然是[4]
算式為E-D+D-C+C-B+B-A=4

第十一行 : 把5組數在結尾補上一個0位 , 再分別除以[1-9] ; 例如[903 , 906 , 909 , 912 , 915] , 除[2]等於[451.5/953.0/454.5/456.0/457.5 ] , 截取小數點後一個位等於[50505] , 小數點後出現餘值等於不能整除 ; 反之 , [903 , 906 , 909 , 912 , 915]除[3] = [301.0/302.0/303.0/304.0/305.0] , 截取小數點後一個位等於[00000] , 小數點後不出現餘值等於能被整除
第十一行通用判斷奇數(被2整除出現00000)、偶數(被2除後出現55555)、1-9倍數(被1-9整除出現00000) , 所以非[00000]也非[55555]之數正是樓主所需篩選出來的值
算式為[A string]/2 , [B string]/2  , [C string]/2 , [D string]/2 , [E string]/2  =   [00000] or [55555] or [0和5的混合字串]

==================================
所以 , 綜合判斷條件其實只是需要[去零]、[去連續數]、[分辨整除數]三條算式
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

返回列表