请教各位一个很菜的算法问题:有一个字符串,要将其奇数位和偶数位对换,怎么实现。比如原字符串为25689845,变换后为52868954.

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    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;
      

  2.   

    procedure swap(var ch1:char;var ch2:Char);
    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;
      

  3.   

    //来一个汇编的。:)
    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;
      

  4.   

    更正一下
    Result := Str;
    if Result<>'' then
      asm
        ....
      end;
    加一个判断
      

  5.   

    这段汇编好象有问题哦, result := str后面必须加一句UniqueString(result), 不然修改的是原串
    另外这样效率是否更高一点?
    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;
      

  6.   

    To Idle_(阿呆)
    result := str
    就已经分配新内存了,不需要调用UniqueString
    当然了,用串操作指令LODSx,STOSx,肯定要快得多。:)