|
flyinspace
银牌会员
积分 1206
发帖 517
注册 2007-3-25
状态 离线
|
『第
16 楼』:
Quote: | Originally posted by bjsh at 2007-4-30 04:16 PM:
抽出了点时间 写了这个..
结果为:24691356902469134
|
|
不错,但会产生临时文件。
其实有办法不产生临时文件的。。youxia01 给了我们最好的提示:)
|
知,不觉多。不知,乃求知 |
|
2007-5-1 05:35 |
|
|
bjsh
银牌会员
积分 2000
发帖 621
注册 2007-1-1
状态 离线
|
『第
17 楼』:
本来也不想产生临时文件;
本来想把/替换为alt+13;
不过没有实现我的想法;真想去debug看看;
无奈时间比较紧.;
就写了下来..
|
|
2007-5-1 05:44 |
|
|
zhoushijay
高级用户
Autowalk
积分 845
发帖 375
注册 2007-3-3
状态 离线
|
『第
18 楼』:
set "num1=qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
set "num2=aaaaa2/23456789012345678/asdfssasd/asdaa"
这2个数应该是
2341234567890123456
+ 223456789012345678
-----------------------------------------
2564691356902469134
这样的吧,前面字母里还夹杂着数字呢
[ Last edited by zhoushijay on 2007-4-30 at 04:52 PM ]
|
|
2007-5-1 05:50 |
|
|
flyinspace
银牌会员
积分 1206
发帖 517
注册 2007-3-25
状态 离线
|
『第
19 楼』:
Quote: | Originally posted by zhoushijay at 2007-4-30 04:50 PM:
set "num1=qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
set "num2=aaaaa2/23456789012345678/asdfssasd/asdaa"
这2个数应该是
2341234567890123456
+ 22345678901234567 ... |
|
噢。我们只要纯数字的那一组组合呀。。
|
知,不觉多。不知,乃求知 |
|
2007-5-1 06:07 |
|
|
lxmxn
版主
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第
20 楼』:
Quote: | Originally posted by bjsh at 2007-4-30 16:44:
本来也不想产生临时文件;
本来想把/替换为alt+13;
不过没有实现我的想法;真想去debug看看;
无奈时间比较紧.;
就写了下来.. |
|
要把/替换成换行,可以参考一下这个:
@echo off&Setlocal EnableDelayedExpansion
for /f "delims=" %%a in (1.txt) do (
set str=%%a
set str=!str:/=$_!
exit|cmd/kprompt !str!>>new_.txt
)
start new_.txt
此帖被 +4 点积分 点击查看详情 评分人:【 bjsh 】 | 分数: +4 | 时间:2007-5-1 07:30 |
|
|
|
2007-5-1 06:20 |
|
|
everest79
金牌会员
一叶枝头,万树皆春
积分 2564
发帖 1127
注册 2006-12-25
状态 离线
|
『第
21 楼』:
我原来写过的一个大数加法,根据要求改了一下
@ECHO OFF 2>nul 3>nul&setlocal enabledelayedexpansion
set "num1=qwer/asdf2/asd34f/1234567890123456/asdf/aaaa"
set "num2=aaaaa2/23456789012345678/asdfssasd/asdaa"
set num=%num1:/= % %num2:/= %
for %%i in (%num%) do echo %%i|findstr /b /e [0-9]*[0-9]&&SET Z=/0%%i !z!
call :next %z%&&goto :eof
:next
set A=%~1&set B=%~2
:ADD
SET/AX-=1
CALL SET/AT1=%%A:~%X%,1%%+%%B:~%X%,1%%||(
ECHO %T3%%C%&&PAUSE&&GOTO :EOF)
CALL SET T3=%%A:~2,%X%%%%%B:~2,%X%%%
SET/A1/T2&&SET/AT1=T1+1
SET/AT2=1/(T1/10)||SET T2=0
SET C=%T1:~-1%%C%
GOTO ADD
此帖被 +12 点积分 点击查看详情 评分人:【 chenall 】 | 分数: +5 | 时间:2007-4-30 23:36 | 评分人:【 flyinspace 】 | 分数: +3 | 时间:2007-5-1 06:36 | 评分人:【 bjsh 】 | 分数: +4 | 时间:2007-5-1 08:22 |
|
|
|
2007-5-1 06:28 |
|
|
flyinspace
银牌会员
积分 1206
发帖 517
注册 2007-3-25
状态 离线
|
『第
22 楼』:
SET/A1/T2&&SET/AT1=T1+1
SET/AT2=1/(T1/10)||SET T2=0
这个有点不明白??
SET/A1/T2 && SET/AT1=T1+1
event79兄可以解释一下么?
|
知,不觉多。不知,乃求知 |
|
2007-5-1 06:38 |
|
|
everest79
金牌会员
一叶枝头,万树皆春
积分 2564
发帖 1127
注册 2006-12-25
状态 离线
|
『第
23 楼』:
这个是按字符位由右向左递增进行个位数相加
SET/A1/T2&&SET/AT1=T1+1 //set /a 1/t2这个来判断t2(t2为上一循环进位)是否为零,若不是,将当前结果t1加一
SET/AT2=1/(T1/10)||SET T2=0 //set /a t2=1/(t1/10)这个判断当前循环结果(t1)是否大于10,若大于十,t2将被赋值为一(下一循环上一步),若小于十,则将进位t2置为零
|
|
2007-5-1 06:47 |
|
|
flyinspace
银牌会员
积分 1206
发帖 517
注册 2007-3-25
状态 离线
|
『第
24 楼』:
Quote: | Originally posted by everest79 at 2007-4-30 05:47 PM:
这个是按字符位由右向左递增进行个位数相加
SET/A1/T2&&SET/AT1=T1+1 //set /a 1/t2这个来判断t2(t2为上一循环进位)是否为零,若不是,将当前结果t1加一
SET/AT2=1/(T1/10)||SET T2=0 //set /a t2=1/(t1/10)这个判断当前循环结果(t1)是否大于10,若大于十,t2将被赋值为一(下一循环上一步),若小于十,则将进位t2置为零
|
|
谢谢兄的说明,我理解了这句话的含义!
新的问题是: 为什么要 set/a1/t2&&set/at1=t1+1
加这个 / 有什么用?
按你的说法:这句话相当于>
set /a xxx= 1 / t2
利用 set /a 的特殊性:
若 xxx 小于1,则 xxx= 0
为 0 满足条件。则 t2 += 1
又学到了一招。。有点类似 set /p 的感觉?且不要=号。
|
知,不觉多。不知,乃求知 |
|
2007-5-1 06:56 |
|
|
everest79
金牌会员
一叶枝头,万树皆春
积分 2564
发帖 1127
注册 2006-12-25
状态 离线
|
『第
25 楼』:
set /a a=1+1可以缩写为set/aa=1+1,那时我刚打别人实例上看到这个,所以就这么给写上了,不算好的书写习惯
|
|
2007-5-1 07:00 |
|
|
flyinspace
银牌会员
积分 1206
发帖 517
注册 2007-3-25
状态 离线
|
『第
26 楼』:
Quote: | Originally posted by everest79 at 2007-4-30 06:00 PM:
set /a a=1+1可以缩写为set/aa=1+1,那时我刚打别人实例上看到这个,所以就这么给写上了,不算好的书写习惯 |
|
set /a a=1/a 也相当于 set /a1/a??
|
知,不觉多。不知,乃求知 |
|
2007-5-1 07:06 |
|
|
everest79
金牌会员
一叶枝头,万树皆春
积分 2564
发帖 1127
注册 2006-12-25
状态 离线
|
『第
27 楼』:
不是的
set /a a=1/a是计算赋值
set /a 1/a只是计算
|
|
2007-5-1 07:59 |
|
|
youxi01
高级用户
积分 846
发帖 247
注册 2006-10-27 来自 湖南==》广东
状态 离线
|
『第
28 楼』:
21F的代码似乎有点点问题,要继续修改下:
测试如下:
19586
453
10039
请按任意键继续. . . 自己也发一段不成熟的代码(如果段数较多时,效率较高):
::code by youxi01@cn-dos.net
@echo off & setlocal enabledelayedexpansion
set "str1=qwer/asdf2/asd34f/13546641654546546654654654144553098785546154/asdf/aaaa"
set "str2=aaaaa2/453216543225443263845482842643/asdfssasd/asdaa"
call :GetNum "%str1%" num1
call :GetNum "%str2%" num2
call :Split %num1%
set/a Mnum=%num%,num=0,flag=0
call :Split %num2%
if %Mnum% LSS %num% set/a Mnum=%num%
set/a Mnum_=%Mnum%-1
for /l %%i in (1 1 %Mnum_%) do (
set/a Rnum%%i+=!flag!
if !Rnum%%i! GTR 10000 set/a flag=1
set Rnum%%i=000!Rnum%%i!
set Rnum%%i=!Rnum%%i:~-4!
set Rstr=!Rnum%%i!!Rstr!)
set/a Rnum%Mnum%+=%flag%
echo !Rnum%Mnum%!!Rstr!
pause>nul
:GetNum OBJ Res
for /f "delims=/ tokens=1,*" %%i in ("%~1") do (
if %%i LSS a set %2=%%i & goto :eof
call :GetNum "%%j" %2
) & goto :eof
:Split OBJ
set str=%~1
set/a num+=1
if %str% LSS 10000 set/a Rnum%num%+=%str% & goto :eof
set/a Rnum%num%+=10000%str:~-4%%%10000
set str=%str:~0,-4%
call :Split "%str%"
|
|
2007-5-2 17:35 |
|
|
flyinspace
银牌会员
积分 1206
发帖 517
注册 2007-3-25
状态 离线
|
『第
29 楼』:
Quote: | Originally posted by youxi01 at 2007-5-2 04:35 AM:
21F的代码似乎有点点问题,要继续修改下:
测试如下:
19586
453
10039
请按任意键继续. . . 自己也发一段不成熟的代码(如果段数较多 ... |
|
代码看得好累。。
有没有算法??
给个提示?
|
知,不觉多。不知,乃求知 |
|
2007-5-2 19:02 |
|
|
youxi01
高级用户
积分 846
发帖 247
注册 2006-10-27 来自 湖南==》广东
状态 离线
|
『第
30 楼』:
::code by youxi01@cn-dos.net
@echo off & setlocal enabledelayedexpansion
set "str1=qwer/asdf2/asd34f/13546641/asdf/aaaa"
set "str2=aaaaa2/45321/asdfssasd/asdaa"
call :GetNum "%str1%" num1
call :GetNum "%str2%" num2
call :Split %num1%
REM Mnum保存结果的段数(用来接受最大的段数);
REM 将num的值重新归0,用来继续调用"函数"
REM flag为进位标记,如果为1,则下段数字加1;这里为初始值,设置为1。
set/a Mnum=%num%,num=0,flag=0
call :Split %num2%
if %Mnum% LSS %num% set/a Mnum=%num%
set/a Mnum_=%Mnum%-1
for /l %%i in (1 1 %Mnum_%) do (
set/a Rnum%%i+=!flag!
if !Rnum%%i! GTR 10000 set/a flag=1
REM 在前面加000,是为了补齐数字的,防止333这样位数不足4位的数字。
set Rnum%%i=000!Rnum%%i!
set Rnum%%i=!Rnum%%i:~-4!
set Rstr=!Rnum%%i!!Rstr!)
set/a Rnum%Mnum%+=%flag%
echo !Rnum%Mnum%!!Rstr!
pause>nul
:GetNum OBJ Res
for /f "delims=/ tokens=1,*" %%i in ("%~1") do (
REM 利用是否大于a,来检测是否是数字,如果是,则一定小于a(不管是多少位的数字)
REM 如果检测到数字,则退出。
if %%i LSS a set %2=%%i & goto :eof
REM 循环检测;
call :GetNum "%%j" %2
) & goto :eof
:Split OBJ
set str=%~1
set/a num+=1
REM 如果,切割后的数字小于10000,则设置自身的值为原值加上该数字,并退出;
if %str% LSS 10000 set/a Rnum%num%+=%str% & goto :eof
REM 利用willsort的办法,屏除类似0001给利用set/a计算带来的错误;
set/a Rnum%num%+=10000%str:~-4%%%10000
set str=%str:~0,-4%
call :Split "%str%"
|
|
2007-5-3 15:17 |
|