请问如何把小数转成分数,如0.5->1/2;0.125->1/8;谢谢!

解决方案 »

  1.   

    基本思路:
    1、先通分,比如0.5->5/10;0.125->125/1000
    2、再约分,5/10->1/2;125/1000->1/8;
    关键是约分算法,需要点时间,我给你写写看
      

  2.   

    这是个月份算法,不是很好,有时间我再给你想procedure KillNum(var N, D: Integer);
    var
      I: Integer;
    begin
      I := 2;
      while I < N div 2 do
      begin
        if (N mod I = 0) and (D mod I = 0) then
        begin
          D := D div I;
          N := N div I;
          I := 2;
        end;
      end;
      if D mod N = 0 then
      begin
        D := D div N;
        N := 1;
      end;
    end;
      

  3.   

    上面的算法有问题,这个是我修改后的,用于约分两个正整数procedure KillNum(var Num1, Num2: Integer);
    var
      I: Integer;
    begin
      if (Num1 <= 0) or (Num2 <= 0) then
        raise Exception.CreateFmt('%d 和 %d 不是正整数,无法计算', [Num1, Num2]);  if Num1 < Num2 then
      begin
        I := 2;
        while I < Num1 div 2 do
        begin
          if (Num1 mod I = 0) and (Num2 mod I = 0) then
          begin
            Num2 := Num2 div I;
            Num1 := Num1 div I;
            Continue;
          end;
          Inc(I);
        end;
        if Num2 mod Num1 = 0 then
        begin
          Num2 := Num2 div Num1;
          Num1 := 1;
        end;
      end
      else if Num1 > Num2 then
      begin
        KillNum(Num2, Num1);
      end
      else begin
        Num1 := 1;
        Num2 := 1;
      end
    end;