标题: [趣味]用批处理演示:数字黑洞6174 [打印本页]
作者: 523066680 时间: 2011-10-17 23:15 标题: [趣味]用批处理演示:数字黑洞6174
关于:
数字黑洞6174
任选一个四位数(数字不能全相同),把所有数字从大道小排列,再把所有数字从小到大排列,
用前者减去后者得到一个新的数。 对新得到的数重复进行上述操作,7步以内必然会得到6174
例如,选择四位数6767:
7766-6677=1089
9810-0189=9621
9621-1269=8352
8532-2358=6174
7641-1467=6174....
6174这个“黑洞”就叫做Kaprekar常数。对于三位数,也有一个数字黑洞--495
用批处理做随机演示,或者由用户输入数字。
作者: cjiabing 时间: 2011-10-18 00:09
哈哈,这个小时候玩过。
我谈谈,我不写:
1、任选、四位数、数字不能全相同,4123
2、把所有数字从大到小排列,4321
3、再把所有数字从小到大排列,1234
4、用前者减去后者得到一个新的数。4321-1234=3087
5、 对新得到的数重复进行上述操作,7步以内必然会得到6174。
3087
8730-0378=8325
8325
8532-2358=6174
另外有一个游戏可能大家玩过,就是猜上个月的多少号是星期几,这个月的一号是星期五,25号是星期几,星期一一列下来相加和星期五一列数下来相减……,蛮好玩的。
作者: 601997526 时间: 2011-10-18 18:38
这个有点味道,以前没玩过,不过这要用P写出来的话还是没想到什么好方法来比较数字的大小,最后只好用了临时文件- @echo off&setlocal enabledelayedexpansion
- title 数字黑洞6174
- :开始
- cls
- set 数字=
- set /p 数字=请输入四位数的数字(演示请按i)
- if /i "%数字%"=="i" call :演示
- echo %数字%|findstr "^[0-9][0-9][0-9][0-9]$"||goto :开始
- :循环
- call :判断
- set /a 数字=%大数%-%小数%
- echo.%数字%
- if not %数字% equ 6174 goto :循环
- pause>nul&goto :开始
- :演示
- set 数字=
- for /l %%i in (1 1 4) do set /a 数%%i=!random!%%10
- for /l %%i in (1 1 4) do set 数字=!数字!!数%%i!
- goto :eof
- :判断
- set n=
- set 大数=
- set 小数=
- (for /l %%i in (0 1 3) do echo !数字:~%%i,1!)>大小判断.txt
- for /f %%i in ('sort 大小判断.txt') do (set /a n+=1
- set 小!n!=%%i)
- del 大小判断.txt
- for /l %%i in (1 1 4) do (set 小数=!小数!!小%%i!
- set 大数=!小%%i!!大数!)
- for /f "tokens=* delims=0" %%i in ("%小数%") do set 小数=%%i
- set/p=%大数%-%小数%=<nul
复制代码
作者: keiamy 时间: 2012-3-14 10:48
本帖最后由 keiamy 于 2012-3-14 10:54 编辑
在无意中发现,原来7877,6766等一系列数字会报错,看来数字黑洞真的有个洞了....
本人是小白,代码是参考3楼的- @echo off&setlocal enabledelayedexpansion
- :begin
- cls
- set /a res=%random%%%8999+1001
- echo 初始数是 %res%
- set n=1
- :lp
- if "!res:%res:~,1%=!"=="" echo %res% 是全相同数&pause&goto begin
- set "str="&set "str1="
- for /l %%i in (0 1 3) do echo !res:~%%i,1!>>tmp.txt
- for /f %%i in ('sort tmp.txt') do set "str=%%i!str!"&set "str1=!str1!%%i"
- set /a res=str-(1%str1%-10000)
- echo %str%-%str1%=%res%
- del tmp.txt
- if %res% neq 6174 set /a n+=1&goto lp
- echo 共运行了 %n% 次
- pause&goto begin
复制代码
作者: xhhivi 时间: 2012-5-2 23:07
本帖最后由 xhhivi 于 2012-5-2 23:15 编辑
还是自己太菜啊,有的地方都没看懂。。。。
第一步就没搞好大家帮看下怎么回事- @echo off
- set b=0000 1111 2222 3333 4444 5555 6666 7777 8888 9999
-
- :a
- set /p a=请输入任意四位数,数字不能全相同:
-
- for %%c in (%b%) do (if exist %%c echo %%c数字相同请重新输入 ! )
- ::pause
- ::goto :a
- pause
- :: else for /l %%c in (1 1 4) do echo %%c>>test.txt
- ::for /f %%c in (‘sort test.txt’)
复制代码
数字相同请重新输入 !都没显示。。。
3楼的好像没判断输入是不是数字是不是全相同啊
作者: garyng 时间: 2012-5-28 15:15
- @echo off&title 数字黑洞
- ::code by garyng@vista sp2
- :main
- setlocal enabledelayedexpansion
- if exist re.txt del /q re.txt
- if exist re1.txt del /q re1.txt
- if exist re2.txt del /q re2.txt
- if exist re3.txt del /q re3.txt
- cls
- set a=&set num=1&set var=
- set /p "var=请输入小于2147483647数字:"
- echo %var%|findstr /b "[0-9]">nul||goto main
- if "!var:~0,1!" equ "0" for /f "delims=0 tokens=*" %%c in ('echo !var!') do (set var=%%c&cls)
- if !var! GEQ 2147483647 echo 数目太大啦~小于2147483647&ping -n 3 127.1>nul 2>nul&goto main
- if !var! equ 0 echo 0减0还是0~&ping -n 3 127.1>nul 2>nul&goto main
- :loop
- for /l %%a in (0,1,15) do if "!var:~%%a,1!" equ "" set a=%%a&goto leng
- :leng
- for /l %%i in (0 1 %a%) do (
- set ch=!var:~%%i,1!
- set pai%%i=!ch!
- if not "!pai%%i!"=="" set /p=!pai%%i! <nul >>re.txt
- )
- (set /p str=)<re.txt
- del /q re.txt
- if !num! equ 1 if !a! GEQ 5 echo 4位数以上的数目重复的不是一个数目,而是一个数组!!
- SETLOCAL ENABLEEXTENSIONS
- for %%b in (%str%) do (
- set str=0000000000%%b
- set .!str:~-10! !random!=%%b
- )
- for /f "tokens=2 delims==" %%b in ('set .') do set/p=%%b<nul>>re1.txt
- endlocal
- (set /p re1=)<re1.txt
- del /q re1.txt
- set /a a-=1
- for /l %%a in (%a% -1 0) do call set /p=%%re1:~%%a,1%%<nul>>re2.txt
- (set /p re2=)<re2.txt
- del /q re2.txt
- if "!re1:~0,1!" equ "0" for /f "delims=0 tokens=*" %%d in ('echo !re1!') do set re1=%%d
- if /i "%re1%" GTR "%re2%" (set /a minus=!re1!-!re2!) else (set /a minus=!re2!-!re1!)
- if !minus! equ 0 echo 变0了~还减啥啊?&echo 按任意键重来...&pause>nul&endlocal&goto main
- echo !minus!>>re3.txt
- set /a line=!num!-1
- (for /l %%e in (1 1 %line%) do set /p re3=)<re3.txt
- if "!minus!" equ "!re3!" (goto repeated) else (echo 第!num!次:!minus!)
- set var=!minus!&set /a num+=1&set a=&set re1=&set re2=&set str=&set minus=&set ch=
- goto loop
- :repeated
- echo ----------&echo 第!num!次:这次的数字!minus!与上次相同~&echo 如果继续下去的话,会一直是同样的数目~&echo 这数字已经“掉进”黑洞里啦~&echo 按任意键重来...&pause>nul&endlocal&goto main
复制代码
很久以前写的。
作者: 悬崖之树 时间: 2012-8-4 19:54
"!res:%res:~,1%=!"=="" 这句怎么理解啊?
作者: 悬崖之树 时间: 2012-8-5 16:21
本帖最后由 悬崖之树 于 2012-8-5 16:23 编辑
回复 5# xhhivi
判断是否相同试试下面的:- @echo off
- set a=0000 1111 2222 3333 4444 5555 6666 7777 8888 9999
- :ks
- set /p b=请输入一个四位数:
- for %%i in (%a%) do (
- if %b%==%%i echo 数字相同请重新输入!& goto ks
- )
- echo 你输入的数符合要求!再来一次吧!& goto ks
复制代码
但是如果你输入的不是四位数的话,也将显示“你输入的数符合要求!再来一次吧!”
作者: 悬崖之树 时间: 2012-8-10 21:30
回复 3# 601997526
为什么有的数字会报错呢?因为代码不完善,应写成:- @echo off & setlocal enabledelayedexpansion
-
- :begin
- set n=1
- set /a res=%random%%%9000+1000
- echo 初始数是 %res%
- if "!res:%res:~,1%=!"=="" echo %res% 是全相同数&pause&goto begin
- :lp
- set "str="&set "str1="
- for /l %%i in (0 1 3) do echo !res:~%%i,1!>>tmp.txt
- for /f %%i in ('sort tmp.txt') do set "str=%%i!str!"&set "str1=!str1!%%i"
- set /a a=%str%-(1%str1%-10000)
- set b=000%a%
- set res=%b:~-4%
- echo %str%-%str1%=%res%
- del tmp.txt
- if %res% neq 6174 set /a n+=1&goto lp
- echo 共运行了%n%次
- pause & cls & goto begin
复制代码
这样就不会出错了!
作者: 悬崖之树 时间: 2012-8-10 21:42
下面这个是手动的,自己输入"7877" 和"6766" 试试吧!还可以输入类似 0001 0101 之类的。- @echo off & setlocal enabledelayedexpansion
- :begin
- set n=1
- set /p res=请输入一个四位数,每位数字是0~9,但不能完全相同:
- if "!res:%res:~,1%=!"=="" echo %res% 是全相同数&pause&goto begin
- :lp
- set "str="&set "str1="
- for /l %%i in (0 1 3) do echo !res:~%%i,1!>>tmp.txt
- for /f %%i in ('sort tmp.txt') do set "str=%%i!str!"&set "str1=!str1!%%i"
- set /a a=%str%-(1%str1%-10000)
- set b=000%a%
- set res=%b:~-4%
- echo %str%-%str1%=%res%
- del tmp.txt
- if %res% neq 6174 set /a n+=1&goto lp
- echo 共运行了%n%次
- pause & cls & goto begin
复制代码
作者: 悬崖之树 时间: 2012-8-10 22:01
本帖最后由 悬崖之树 于 2012-8-10 22:19 编辑
五位数的黑洞是什么呢?
运行下面的就知道了:- @echo off & setlocal enabledelayedexpansion
- :begin
- set /p res=请输入一个五位数,每位数字是0~9,但不能完全相同:
- if "!res:%res:~,1%=!"=="" echo %res% 是全相同数&pause&goto begin
- :lp
- set "str="&set "str1="
- for /l %%i in (0 1 4) do echo !res:~%%i,1!>>tmp.txt
- for /f %%i in ('sort tmp.txt') do set "str=%%i!str!"&set "str1=!str1!%%i"
- set /a a=%str%-(1%str1%-100000)
- set b=0000%a%
- set res=%b:~-5%
- echo %str%-%str1%=%res%
- echo %str%-%str1%=%res%>>2.txt
- del tmp.txt
- goto lp
复制代码
作者: cutebe 时间: 2012-8-11 13:27
随机生成四位数但没有判断四个数字是否全一样- @ECHO OFF
- :ST
- FOR /L %%T IN (1 1 9998)DO CD.
- ECHO=&ECHO=数字黑洞
- SET/aR=%RANDOM%%%9998+1
- CALL :ADD0 R %R%
- :MAIN
- FOR /L %%I IN (0 1 3)DO CALL :VAR N_%%R:~%%I,1%%%%I %%R:~%%I,1%%
- SET MAX=&SET MIN=
- FOR /F "TOKENS=1,2 DELIMS==" %%K IN ('SET N_')DO (
- CALL :VAR MAX %%L%%MAX%%
- CALL :VAR MIN %%MIN%%%%L
- SET %%K=
- )
- SET/aR=1%MAX%-1%MIN%
- CALL :ADD0 R %R%
- ECHO=%MAX%-%MIN%=%R%
- IF "%OMAX%"=="%MAX%" GOTO :ST
- SET/aOMAX=MAX
- GOTO :MAIN
- :ADD0
- SET X=000%2
- SET X=%X:~-4%
- SET %1=%X%
- GOTO :EOF
- :VAR
- SET %~1=%~2
- GOTO :EOF
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |