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

[趣味]用批处理演示:数字黑洞6174

关于:
数字黑洞6174

任选一个四位数(数字不能全相同),把所有数字从大道小排列,再把所有数字从小到大排列,
用前者减去后者得到一个新的数。 对新得到的数重复进行上述操作,7步以内必然会得到6174

例如,选择四位数6767:
7766-6677=1089
9810-0189=9621
9621-1269=8352
8532-2358=6174
7641-1467=6174....

6174这个“黑洞”就叫做Kaprekar常数。对于三位数,也有一个数字黑洞--495


用批处理做随机演示,或者由用户输入数字。

随机生成四位数但没有判断四个数字是否全一样
  1. @ECHO OFF
  2. :ST
  3. FOR /L %%T IN (1 1 9998)DO CD.
  4. ECHO=&ECHO=数字黑洞
  5. SET/aR=%RANDOM%%%9998+1
  6. CALL :ADD0 R %R%
  7. :MAIN
  8. FOR /L %%I IN (0 1 3)DO CALL :VAR N_%%R:~%%I,1%%%%I %%R:~%%I,1%%
  9. SET MAX=&SET MIN=
  10. FOR /F "TOKENS=1,2 DELIMS==" %%K IN ('SET N_')DO (
  11.  CALL :VAR MAX %%L%%MAX%%
  12.  CALL :VAR MIN %%MIN%%%%L
  13.  SET %%K=
  14. )
  15. SET/aR=1%MAX%-1%MIN%
  16. CALL :ADD0 R %R%
  17. ECHO=%MAX%-%MIN%=%R%
  18. IF "%OMAX%"=="%MAX%" GOTO :ST
  19. SET/aOMAX=MAX
  20. GOTO :MAIN
  21. :ADD0
  22. SET X=000%2
  23. SET X=%X:~-4%
  24. SET %1=%X%
  25. GOTO :EOF
  26. :VAR
  27. SET %~1=%~2
  28. GOTO :EOF
复制代码
如无特别说明,代码测试环境均为 XP SP3

TOP

本帖最后由 悬崖之树 于 2012-8-10 22:19 编辑

五位数的黑洞是什么呢?
运行下面的就知道了:
  1. @echo off & setlocal enabledelayedexpansion
  2. :begin
  3. set /p res=请输入一个五位数,每位数字是0~9,但不能完全相同:
  4. if "!res:%res:~,1%=!"=="" echo %res% 是全相同数&pause&goto begin
  5. :lp
  6. set "str="&set "str1="
  7. for /l %%i in (0 1 4) do echo !res:~%%i,1!>>tmp.txt
  8. for /f %%i in ('sort tmp.txt') do set "str=%%i!str!"&set "str1=!str1!%%i"
  9. set /a a=%str%-(1%str1%-100000)
  10. set b=0000%a%
  11. set res=%b:~-5%
  12. echo %str%-%str1%=%res%
  13. echo %str%-%str1%=%res%>>2.txt
  14. del tmp.txt
  15. goto lp
复制代码

TOP

下面这个是手动的,自己输入"7877" 和"6766" 试试吧!还可以输入类似 0001 0101 之类的。
  1. @echo off & setlocal enabledelayedexpansion
  2. :begin
  3. set n=1
  4. set /p res=请输入一个四位数,每位数字是0~9,但不能完全相同:
  5. if "!res:%res:~,1%=!"=="" echo %res% 是全相同数&pause&goto begin
  6. :lp
  7. set "str="&set "str1="
  8. for /l %%i in (0 1 3) do echo !res:~%%i,1!>>tmp.txt
  9. for /f %%i in ('sort tmp.txt') do set "str=%%i!str!"&set "str1=!str1!%%i"
  10. set /a a=%str%-(1%str1%-10000)
  11. set b=000%a%
  12. set res=%b:~-4%
  13. echo %str%-%str1%=%res%
  14. del tmp.txt
  15. if %res% neq 6174 set /a n+=1&goto lp
  16. echo 共运行了%n%次
  17. pause & cls & goto begin
复制代码

TOP

回复 3# 601997526
为什么有的数字会报错呢?因为代码不完善,应写成:
  1. @echo off & setlocal enabledelayedexpansion
  2. :begin
  3. set n=1
  4. set /a res=%random%%%9000+1000
  5. echo 初始数是 %res%
  6. if "!res:%res:~,1%=!"=="" echo %res% 是全相同数&pause&goto begin
  7. :lp
  8. set "str="&set "str1="
  9. for /l %%i in (0 1 3) do echo !res:~%%i,1!>>tmp.txt
  10. for /f %%i in ('sort tmp.txt') do set "str=%%i!str!"&set "str1=!str1!%%i"
  11. set /a a=%str%-(1%str1%-10000)
  12. set b=000%a%
  13. set res=%b:~-4%
  14. echo %str%-%str1%=%res%
  15. del tmp.txt
  16. if %res% neq 6174 set /a n+=1&goto lp
  17. echo 共运行了%n%次
  18. pause & cls & goto begin
复制代码
这样就不会出错了!

TOP

本帖最后由 悬崖之树 于 2012-8-5 16:23 编辑

回复 5# xhhivi


判断是否相同试试下面的:
  1. @echo off
  2. set a=0000 1111 2222 3333 4444 5555 6666 7777 8888 9999
  3. :ks
  4. set /p b=请输入一个四位数:
  5. for %%i in (%a%) do (
  6. if %b%==%%i echo 数字相同请重新输入!& goto ks
  7. )
  8. echo 你输入的数符合要求!再来一次吧!& goto ks
复制代码
但是如果你输入的不是四位数的话,也将显示“你输入的数符合要求!再来一次吧!”

TOP

"!res:%res:~,1%=!"==""  这句怎么理解啊?

TOP

  1. @echo off&title 数字黑洞
  2. ::code by garyng@vista sp2
  3. :main
  4. setlocal enabledelayedexpansion
  5. if exist re.txt del /q re.txt
  6. if exist re1.txt del /q re1.txt
  7. if exist re2.txt del /q re2.txt
  8. if exist re3.txt del /q re3.txt
  9. cls
  10. set a=&set num=1&set var=
  11. set /p "var=请输入小于2147483647数字:"
  12. echo %var%|findstr /b "[0-9]">nul||goto main
  13. if "!var:~0,1!" equ "0" for /f "delims=0 tokens=*" %%c in ('echo !var!') do (set var=%%c&cls)
  14. if !var! GEQ 2147483647 echo 数目太大啦~小于2147483647&ping -n 3 127.1>nul 2>nul&goto main
  15. if !var! equ 0 echo 0减0还是0~&ping -n 3 127.1>nul 2>nul&goto main
  16. :loop
  17. for /l %%a in (0,1,15) do if "!var:~%%a,1!" equ "" set a=%%a&goto leng
  18. :leng
  19. for /l %%i in (0 1 %a%) do (
  20. set ch=!var:~%%i,1!
  21. set pai%%i=!ch!
  22. if not "!pai%%i!"=="" set /p=!pai%%i! <nul >>re.txt
  23. )
  24. (set /p str=)<re.txt
  25. del /q re.txt
  26. if !num! equ 1 if !a! GEQ 5 echo 4位数以上的数目重复的不是一个数目,而是一个数组!!
  27. SETLOCAL ENABLEEXTENSIONS
  28. for %%b in (%str%) do (
  29.     set str=0000000000%%b
  30.     set .!str:~-10! !random!=%%b
  31. )
  32. for /f "tokens=2 delims==" %%b in ('set .') do set/p=%%b<nul>>re1.txt
  33. endlocal
  34. (set /p re1=)<re1.txt
  35. del /q re1.txt
  36. set /a a-=1
  37. for /l %%a in (%a% -1 0) do call set /p=%%re1:~%%a,1%%<nul>>re2.txt
  38. (set /p re2=)<re2.txt
  39. del /q re2.txt
  40. if "!re1:~0,1!" equ "0" for /f "delims=0 tokens=*" %%d in ('echo !re1!') do set re1=%%d
  41. if /i "%re1%" GTR "%re2%" (set /a minus=!re1!-!re2!) else (set /a minus=!re2!-!re1!)
  42. if !minus! equ 0 echo 变0了~还减啥啊?&echo 按任意键重来...&pause>nul&endlocal&goto main
  43. echo !minus!>>re3.txt
  44. set /a line=!num!-1
  45. (for /l %%e in (1 1 %line%) do set /p re3=)<re3.txt
  46. if "!minus!" equ "!re3!" (goto repeated) else (echo 第!num!次:!minus!)
  47. set var=!minus!&set /a num+=1&set a=&set re1=&set re2=&set str=&set minus=&set ch=
  48. goto loop
  49. :repeated
  50. echo ----------&echo 第!num!次:这次的数字!minus!与上次相同~&echo 如果继续下去的话,会一直是同样的数目~&echo 这数字已经“掉进”黑洞里啦~&echo 按任意键重来...&pause>nul&endlocal&goto main
复制代码
很久以前写的。

TOP

本帖最后由 xhhivi 于 2012-5-2 23:15 编辑

还是自己太菜啊,有的地方都没看懂。。。。
第一步就没搞好大家帮看下怎么回事
  1. @echo off
  2. set  b=0000 1111 2222 3333 4444 5555 6666 7777 8888 9999
  3. :a
  4. set /p a=请输入任意四位数,数字不能全相同:
  5. for %%c in (%b%) do (if exist %%c echo %%c数字相同请重新输入 ! )
  6. ::pause
  7. ::goto :a
  8. pause  
  9.   :: else for /l %%c in (1 1 4) do echo %%c>>test.txt
  10. ::for /f %%c in (‘sort test.txt’)
复制代码
数字相同请重新输入 !都没显示。。。
3楼的好像没判断输入是不是数字是不是全相同啊

TOP

本帖最后由 keiamy 于 2012-3-14 10:54 编辑

在无意中发现,原来7877,6766等一系列数字会报错,看来数字黑洞真的有个洞了....
本人是小白,代码是参考3楼的
  1. @echo off&setlocal enabledelayedexpansion
  2. :begin
  3. cls
  4. set /a res=%random%%%8999+1001
  5. echo 初始数是 %res%
  6. set n=1
  7. :lp
  8. if "!res:%res:~,1%=!"=="" echo %res% 是全相同数&pause&goto begin
  9. set "str="&set "str1="
  10. for /l %%i in (0 1 3) do echo !res:~%%i,1!>>tmp.txt
  11. for /f %%i in ('sort tmp.txt') do set "str=%%i!str!"&set "str1=!str1!%%i"
  12. set /a res=str-(1%str1%-10000)
  13. echo %str%-%str1%=%res%
  14. del tmp.txt
  15. if %res% neq 6174 set /a n+=1&goto lp
  16. echo 共运行了 %n% 次
  17. pause&goto begin
复制代码
我是NO.1 呀﹗不過.......@echo是在菜鳥比賽中....>.<

TOP

这个有点味道,以前没玩过,不过这要用P写出来的话还是没想到什么好方法来比较数字的大小,最后只好用了临时文件
  1. @echo off&setlocal enabledelayedexpansion
  2. title 数字黑洞6174
  3. :开始
  4. cls
  5. set 数字=
  6. set /p 数字=请输入四位数的数字(演示请按i)
  7. if /i "%数字%"=="i" call :演示
  8. echo %数字%|findstr "^[0-9][0-9][0-9][0-9]$"||goto :开始
  9. :循环
  10. call :判断
  11. set /a 数字=%大数%-%小数%
  12. echo.%数字%
  13. if not %数字% equ 6174 goto :循环
  14. pause>nul&goto :开始
  15. :演示
  16. set 数字=
  17. for /l %%i in (1 1 4) do set /a 数%%i=!random!%%10
  18. for /l %%i in (1 1 4) do set 数字=!数字!!数%%i!
  19. goto :eof
  20. :判断
  21. set n=
  22. set 大数=
  23. set 小数=
  24. (for /l %%i in (0 1 3) do echo !数字:~%%i,1!)>大小判断.txt
  25. for /f %%i in ('sort 大小判断.txt') do (set /a n+=1
  26. set 小!n!=%%i)
  27. del 大小判断.txt
  28. for /l %%i in (1 1 4) do (set 小数=!小数!!小%%i!
  29. set 大数=!小%%i!!大数!)
  30. for /f "tokens=* delims=0" %%i in ("%小数%") do set 小数=%%i
  31. set/p=%大数%-%小数%=<nul
复制代码

TOP

哈哈,这个小时候玩过。
我谈谈,我不写:
1、任选、四位数、数字不能全相同,4123
2、把所有数字从大到小排列,4321
3、再把所有数字从小到大排列,1234
4、用前者减去后者得到一个新的数。4321-1234=3087
5、 对新得到的数重复进行上述操作,7步以内必然会得到6174。
3087
8730-0378=8325
8325
8532-2358=6174

另外有一个游戏可能大家玩过,就是猜上个月的多少号是星期几,这个月的一号是星期五,25号是星期几,星期一一列下来相加和星期五一列数下来相减……,蛮好玩的。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

返回列表