请教各位一个很菜的算法问题:有一个字符串,要将其奇数位和偶数位对换,怎么实现。比如原字符串为25689845,变换后为52868954.
解决方案 »
- API HOOK delphi转C++
- Pos机收银帐条如何实现的(硬打)?
- 请问如何截获打开输入法的消息?
- TQuickRep的Preview窗体中能够控制打印某页,为什么我的TPreview窗体中就不起作用?
- 今天提交了离职报告,心里空虚得象个鬼似的,烦!-----散分
- 问个sql语句写法
- 在ListBox里我怎么得到选中的Item的text??
- 关于Treeview右键菜单的问题
- 多个panel同时显示 时比较慢
- 请问做共享软件一般怎样收取国外的注册费呢?用哪种信用卡比较好啊?
- mysql三个inner join 的查询加时间倒排序后速度超慢
- 如何调用已有的WSDL开发webservice程序(用delphi7)/如何在webservice中用ADOquery保存数据到数据库?
var
m,n,o:Integer;
i,j:double;
s0,s:String; function RightCopy(S: string; Index,count:Integer): string; //从字符串右边第Index位复制Count个字符
begin
RightCopy := copy(S,Length(S)-count+1-(Index-1),count);
end;begin
s0:='25689845';
i:=0;
j:=0;
n:=0;
o:=0;
for m:=1 to length(s0) do
begin
s:=RightCopy(s0,m,1);
if (m mod 2)=0 then //是偶数位
begin
i:=i+StrToFloat(s)*Power(100.0,n);
inc(n);
end
else
begin
j:=j+StrToFloat(s)*Power(100.0,o)*10;
inc(o);
end;
end;
Showmessage(FormatFloat('#',i+j)); //返回 52868954
end;
var
tmp:Char;
begin
tmp:=ch1;
ch1:=ch2;
ch2:=tmp;
end;function xchg(str:string):string;
var
s:string;
i:Integer;
begin
i:=1;
s:=str;
while i<Length(s) do
begin
swap(s[i],s[i+1]);
Inc(i,2);
end;
result:=s;
end;
function xchg(str:string):string;
begin
Result := Str;
asm
PUSHAD;
MOV EBX , Result;
MOV EBX , [EBX];
MOV ECX , [EBX-4];
DEC ECX;
XOR EAX , EAX;
@Loop1:
CMP EAX , ECX;
JNB @Exit;
MOV DL , [EBX + EAX];
XCHG [EBX + EAX + 1] , DL;
MOV [EBX + EAX] , DL;
ADD EAX , 2;
JMP @Loop1;
@Exit:
POPAD;
end;
end;
Result := Str;
if Result<>'' then
asm
....
end;
加一个判断
另外这样效率是否更高一点?
function XChg(Str: string): string;
asm
PUSH ESI
PUSH EDI
MOV ESI, EAX
CALL @UniqueString
MOV EDI, EAX
MOV ECX, [ESI-4]
SHR ECX, 1
TEST ECX, ECX
JZ @@2
@@1:
LODSW
XCHG AH, AL
STOSW
LOOP @@1
@@2:
POP EDI
POP ESI
RET
end;
result := str
就已经分配新内存了,不需要调用UniqueString
当然了,用串操作指令LODSx,STOSx,肯定要快得多。:)