返回列表 发帖

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

关于:
数字黑洞6174

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

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

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


用批处理做随机演示,或者由用户输入数字。
[url=][/url]

随机生成四位数但没有判断四个数字是否全一样
@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 :EOFCOPY
如无特别说明,代码测试环境均为 XP SP3

TOP

本帖最后由 悬崖之树 于 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 lpCOPY

TOP

下面这个是手动的,自己输入"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 beginCOPY

TOP

回复 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 beginCOPY
这样就不会出错了!

TOP

本帖最后由 悬崖之树 于 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 ksCOPY
但是如果你输入的不是四位数的话,也将显示“你输入的数符合要求!再来一次吧!”

TOP

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

TOP

@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 00还是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 echo0了~还减啥啊?&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 mainCOPY
很久以前写的。

TOP

本帖最后由 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’)COPY
数字相同请重新输入 !都没显示。。。
3楼的好像没判断输入是不是数字是不是全相同啊

TOP

本帖最后由 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 beginCOPY
我是NO.1 呀﹗不過.......@echo是在菜鳥比賽中....>.<

TOP

这个有点味道,以前没玩过,不过这要用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=%大数%-%小数%=<nulCOPY

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

返回列表