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

[文本处理] 【出题】批处理生成干支纪年法年份表

批处理生成年份表:1900-2099年

如(格式):1911-辛亥 1912-壬子

类似话题

出题:列出干支纪年法的所有组合
http://bbs.verybat.org/viewthread.php?tid=15834
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

我也来做做题

首先查得1900年是庚子年,依此编写代码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "tg=庚辛壬癸甲乙丙丁戊己"
  3. set "dz=子丑寅卯辰巳午未申酉戌亥"
  4. for /l %%a in (1,1,60) do (
  5.     set "_%%a=!tg:~,1!!dz:~,1!"
  6.     set "tg=!tg:~1!!tg:~,1!"
  7.     set "dz=!dz:~1!!dz:~,1!"
  8. )
  9. for /l %%a in (1900,1,2009) do (
  10.     set /a n+=1,m=n%%60
  11.     if !m! equ 0 set /a m=60
  12.     for %%b in (!m!) do echo %%a-!_%%b!
  13. )
  14. pause>nul
复制代码
***共同提高***

TOP

还可再简化

  1. @echo off&setlocal enabledelayedexpansion
  2. set "tg=庚辛壬癸甲乙丙丁戊己"
  3. set "dz=子丑寅卯辰巳午未申酉戌亥"
  4. for /l %%a in (1900,1,2009) do (
  5.     echo %%a-!tg:~,1!!dz:~,1!
  6.     set "tg=!tg:~1!!tg:~,1!"
  7.     set "dz=!dz:~1!!dz:~,1!"
  8. )
  9. pause>nul
复制代码
***共同提高***

TOP

如果只给出天干、地支的原始顺序,而不知道起始年的干支,只给出一个例子“1911-辛亥”,推算出所有的干支年。(当然历史上的干支顺序早已固定,但如果重新设定一种纪年方式,比如金木水火土,就只能通过推算了——“庚辛壬癸甲乙丙丁戊己”如何得知?)
  1. @echo off
  2. set 天干=甲乙丙丁戊己庚辛壬癸
  3. set 地支=子丑寅卯辰巳午未申酉戌亥
  4. setlocal EnableDelayedExpansion
  5. set 天干2=%天干%%天干%$
  6. set 地支2=%地支%%地支%$
  7. for /f "tokens=1,2 delims=-" %%i in ("1911-辛亥") do (
  8.     set y=%%j
  9.     set 干=!y:~,1!&set 支=!y:~1!
  10.     set /a "m=%%i %% 10, n=%%i %% 12"
  11.     for /f "tokens=1-4" %%a in ("!干! !支! !m! !n!") do (
  12.         set 临干=%%a!天干2:*%%a=!
  13.         call set left=%%天干2:!临干!=%%
  14.         if defined left set 临干=!left:~-%%c!!临干!
  15.         set 临支=%%b!地支2:*%%b=!
  16.         call set left=%%地支2:!临支!=%%
  17.         if defined left set 临支=!left:~-%%d!!临支!
  18.     )
  19. )
  20. set 天干=%临干:~,10%
  21. set 地支=%临支:~,12%
  22. for /l %%a in (1900,1,2009) do (
  23.     set /a 干=%%a %% 10, 支=%%a %% 12
  24.     for /f "tokens=1,2" %%i in ("!干! !支!") do echo %%a-!天干:~%%i,1!!地支:~%%j,1!
  25. )
  26. echo;&pause
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

2楼提出的列出干支纪年法的所有组合,其核心问题是最小公倍数的计算,并且涉及字符串长度的计算。或者通过其他思路求出所有组合。

这个题目衍生出了2个新的问题:
1、如何确定某个字符(字符串)在一个字符串中首次出现的位置?
2、如何对字符串循环左移或右移,让某个字符移动到具有指定偏移量的位置?
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

我的想法(避开1911-辛亥等):
  1. @echo off&setlocal enabledelayedexpansion
  2. set _1=辛&set _2=壬
  3. set _3=癸&set _4=甲
  4. set _5=乙&set _6=丙
  5. set _7=丁&set _8=戊
  6. set _9=己&set _0=庚
  7. set 0_=申&set 1_=酉
  8. set 2_=戌&set 3_=亥
  9. set 4_=子&set 5_=丑
  10. set 6_=寅&set 7_=卯
  11. set 8_=辰&set 9_=巳
  12. set 10_=午&set 11_=未
  13. for /l %%a in (1900,1,2099) do call :sub %%a
  14. pause>nul
  15. :sub
  16. set /a a=%1%%12
  17. set t_=%1&set t=!t_:~-1!
  18. echo !t_!-!_%t%!!%a%_!年
  19. goto :eof
复制代码

[ 本帖最后由 lxzzr 于 2009-10-31 14:10 编辑 ]

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set "tg=甲乙丙丁戊己庚辛壬癸"
  3. set "dz=子丑寅卯辰巳午未申酉戌亥"
  4. for /l %%i in (1900,1,2009) do (
  5.     set /a "m=(%%i-4)%%10,n=(%%i-4)%%12"
  6.     for %%a in (!m!) do for %%b in (!n!) do echo %%i-!tg:~%%a,1!!dz:~%%b,1!
  7. )
  8. pause>nul
复制代码
1

评分人数

    • lxzzr: 自己研究的算法还是百度的?PB + 10

TOP

回复 5楼 的帖子

考虑不周,call那两行应改为:
call set left=%天干%%%天干2:!临干!=%%
call set left=%地支%%%地支2:!临支!=%%
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

原帖由 zqz0012005 于 2009-10-30 22:43 发表
如果只给出天干、地支的原始顺序,而不知道起始年的干支,只给出一个例子“1911-辛亥”,推算出所有的干支年。(当然历史上的干支顺序早已固定,但如果重新设定一种纪年方式,比如金木水火土,就只能通过推算了——“ ...

这样也可
  1. @echo off&setlocal enabledelayedexpansion
  2. set "天干=甲乙丙丁戊己庚辛壬癸"
  3. set "地支=子丑寅卯辰巳午未申酉戌亥"
  4. set "Z=1911-辛亥"
  5. set/a "m=!z:~,4!%%10,n=!z:~,4!%%12"
  6. for /l %%i in (0 1 11) do (
  7.     if "!天干:~%%i,1!"=="!Z:~-2,1!" set /a m=%%i-m
  8.     if "!地支:~%%i,1!"=="!Z:~-1,1!" set /a n=%%i-n
  9.     )
  10. set "天干=!天干:~%m%!!天干:~,%m%!"
  11. set "地支=!地支:~%n%!!地支:~,%n%!"
  12. echo !天干!
  13. echo !地支!
  14. pause>nul
复制代码

TOP

回复 10楼 的帖子

for /l %%i in (0 1 11) do ...
这个循环次数,要计算字符串长度哦!

[ 本帖最后由 zqz0012005 于 2009-11-1 12:50 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

  1. @echo off
  2. set 天干=甲乙丙丁戊己庚辛壬癸
  3. set 地支=子丑寅卯辰巳午未申酉戌亥
  4. setlocal EnableDelayedExpansion
  5. set known=1911-辛亥
  6. set 干=%known:~-2,1%&set 支=%known:~-1%
  7. set /a "m=known %% 10, n=known %% 12"
  8. set 临干=%干%!天干:*%干%=!
  9. set left=%天干%!天干:%临干%=!
  10. set 临干=!left:~-%m%!%临干%
  11. set 临支=%支%!地支:*%支%=!
  12. set left=%地支%!地支:%临支%=!
  13. set 临支=!left:~-%n%!%临支%
  14. set 新干=%临干%!天干:%临干%=!
  15. set 新支=%临支%!地支:%临支%=!
  16. for /l %%a in (1900,1,2009) do (
  17.     set /a 干=%%a %% 10, 支=%%a %% 12
  18.     for /f "tokens=1,2" %%i in ("!干! !支!") do echo %%a-!新干:~%%i,1!!新支:~%%j,1!
  19. )
  20. echo;&pause
复制代码
我想用循环移位避开长度计算,但
set /a "m=%%i %% 10, n=%%i %% 12"
10、12,还是要计算长度的。。。


PS:set /a "m=known %% 10, n=known %% 12" 不是写错了(本应写成%known:~,4%),原理见
http://www.bathome.net/viewthrea ... amp;page=2#pid32134
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表