标题: [文本处理] 【出题】批处理生成干支纪年法年份表 [打印本页]
作者: lxzzr 时间: 2009-10-30 17:31 标题: 【出题】批处理生成干支纪年法年份表
批处理生成年份表:1900-2099年
如(格式):1911-辛亥 1912-壬子
作者: zqz0012005 时间: 2009-10-30 19:13 标题: 类似话题
出题:列出干支纪年法的所有组合
http://bbs.verybat.org/viewthread.php?tid=15834
作者: batman 时间: 2009-10-30 21:31 标题: 我也来做做题
首先查得1900年是庚子年,依此编写代码如下:- @echo off&setlocal enabledelayedexpansion
- set "tg=庚辛壬癸甲乙丙丁戊己"
- set "dz=子丑寅卯辰巳午未申酉戌亥"
- for /l %%a in (1,1,60) do (
- set "_%%a=!tg:~,1!!dz:~,1!"
- set "tg=!tg:~1!!tg:~,1!"
- set "dz=!dz:~1!!dz:~,1!"
- )
- for /l %%a in (1900,1,2009) do (
- set /a n+=1,m=n%%60
- if !m! equ 0 set /a m=60
- for %%b in (!m!) do echo %%a-!_%%b!
- )
- pause>nul
复制代码
作者: batman 时间: 2009-10-30 21:37 标题: 还可再简化
- @echo off&setlocal enabledelayedexpansion
- set "tg=庚辛壬癸甲乙丙丁戊己"
- set "dz=子丑寅卯辰巳午未申酉戌亥"
- for /l %%a in (1900,1,2009) do (
- echo %%a-!tg:~,1!!dz:~,1!
- set "tg=!tg:~1!!tg:~,1!"
- set "dz=!dz:~1!!dz:~,1!"
- )
- pause>nul
复制代码
作者: zqz0012005 时间: 2009-10-30 22:43
如果只给出天干、地支的原始顺序,而不知道起始年的干支,只给出一个例子“1911-辛亥”,推算出所有的干支年。(当然历史上的干支顺序早已固定,但如果重新设定一种纪年方式,比如金木水火土,就只能通过推算了——“庚辛壬癸甲乙丙丁戊己”如何得知?)- @echo off
- set 天干=甲乙丙丁戊己庚辛壬癸
- set 地支=子丑寅卯辰巳午未申酉戌亥
- setlocal EnableDelayedExpansion
- set 天干2=%天干%%天干%$
- set 地支2=%地支%%地支%$
- for /f "tokens=1,2 delims=-" %%i in ("1911-辛亥") do (
- set y=%%j
- set 干=!y:~,1!&set 支=!y:~1!
- set /a "m=%%i %% 10, n=%%i %% 12"
- for /f "tokens=1-4" %%a in ("!干! !支! !m! !n!") do (
- set 临干=%%a!天干2:*%%a=!
- call set left=%%天干2:!临干!=%%
- if defined left set 临干=!left:~-%%c!!临干!
- set 临支=%%b!地支2:*%%b=!
- call set left=%%地支2:!临支!=%%
- if defined left set 临支=!left:~-%%d!!临支!
- )
- )
- set 天干=%临干:~,10%
- set 地支=%临支:~,12%
- for /l %%a in (1900,1,2009) do (
- set /a 干=%%a %% 10, 支=%%a %% 12
- for /f "tokens=1,2" %%i in ("!干! !支!") do echo %%a-!天干:~%%i,1!!地支:~%%j,1!
- )
- echo;&pause
复制代码
作者: zqz0012005 时间: 2009-10-30 22:51
2楼提出的列出干支纪年法的所有组合,其核心问题是最小公倍数的计算,并且涉及字符串长度的计算。或者通过其他思路求出所有组合。
这个题目衍生出了2个新的问题:
1、如何确定某个字符(字符串)在一个字符串中首次出现的位置?
2、如何对字符串循环左移或右移,让某个字符移动到具有指定偏移量的位置?
作者: lxzzr 时间: 2009-10-31 14:04
我的想法(避开1911-辛亥等):
-
- @echo off&setlocal enabledelayedexpansion
- set _1=辛&set _2=壬
- set _3=癸&set _4=甲
- set _5=乙&set _6=丙
- set _7=丁&set _8=戊
- set _9=己&set _0=庚
- set 0_=申&set 1_=酉
- set 2_=戌&set 3_=亥
- set 4_=子&set 5_=丑
- set 6_=寅&set 7_=卯
- set 8_=辰&set 9_=巳
- set 10_=午&set 11_=未
- for /l %%a in (1900,1,2099) do call :sub %%a
- pause>nul
- :sub
- set /a a=%1%%12
- set t_=%1&set t=!t_:~-1!
- echo !t_!-!_%t%!!%a%_!年
- goto :eof
复制代码
[ 本帖最后由 lxzzr 于 2009-10-31 14:10 编辑 ]
作者: terse 时间: 2009-10-31 15:04
- @echo off&setlocal enabledelayedexpansion
- set "tg=甲乙丙丁戊己庚辛壬癸"
- set "dz=子丑寅卯辰巳午未申酉戌亥"
- for /l %%i in (1900,1,2009) do (
- set /a "m=(%%i-4)%%10,n=(%%i-4)%%12"
- for %%a in (!m!) do for %%b in (!n!) do echo %%i-!tg:~%%a,1!!dz:~%%b,1!
- )
- pause>nul
复制代码
作者: zqz0012005 时间: 2009-10-31 19:11 标题: 回复 5楼 的帖子
考虑不周,call那两行应改为:
call set left=%天干%%%天干2:!临干!=%%
call set left=%地支%%%地支2:!临支!=%%
作者: terse 时间: 2009-11-1 10:56
原帖由 zqz0012005 于 2009-10-30 22:43 发表
如果只给出天干、地支的原始顺序,而不知道起始年的干支,只给出一个例子“1911-辛亥”,推算出所有的干支年。(当然历史上的干支顺序早已固定,但如果重新设定一种纪年方式,比如金木水火土,就只能通过推算了——“ ...
这样也可
- @echo off&setlocal enabledelayedexpansion
- set "天干=甲乙丙丁戊己庚辛壬癸"
- set "地支=子丑寅卯辰巳午未申酉戌亥"
- set "Z=1911-辛亥"
- set/a "m=!z:~,4!%%10,n=!z:~,4!%%12"
- for /l %%i in (0 1 11) do (
- if "!天干:~%%i,1!"=="!Z:~-2,1!" set /a m=%%i-m
- if "!地支:~%%i,1!"=="!Z:~-1,1!" set /a n=%%i-n
- )
- set "天干=!天干:~%m%!!天干:~,%m%!"
- set "地支=!地支:~%n%!!地支:~,%n%!"
- echo !天干!
- echo !地支!
- pause>nul
复制代码
作者: zqz0012005 时间: 2009-11-1 11:25 标题: 回复 10楼 的帖子
for /l %%i in (0 1 11) do ...
这个循环次数,要计算字符串长度哦!
[ 本帖最后由 zqz0012005 于 2009-11-1 12:50 编辑 ]
作者: zqz0012005 时间: 2009-11-1 12:53
- @echo off
- set 天干=甲乙丙丁戊己庚辛壬癸
- set 地支=子丑寅卯辰巳午未申酉戌亥
-
- setlocal EnableDelayedExpansion
- set known=1911-辛亥
- set 干=%known:~-2,1%&set 支=%known:~-1%
- set /a "m=known %% 10, n=known %% 12"
-
- set 临干=%干%!天干:*%干%=!
- set left=%天干%!天干:%临干%=!
- set 临干=!left:~-%m%!%临干%
-
- set 临支=%支%!地支:*%支%=!
- set left=%地支%!地支:%临支%=!
- set 临支=!left:~-%n%!%临支%
-
- set 新干=%临干%!天干:%临干%=!
- set 新支=%临支%!地支:%临支%=!
-
- for /l %%a in (1900,1,2009) do (
- set /a 干=%%a %% 10, 支=%%a %% 12
- for /f "tokens=1,2" %%i in ("!干! !支!") do echo %%a-!新干:~%%i,1!!新支:~%%j,1!
- )
- 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
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |