已知a,b,c三数,求此x的最小值.(abcx均为正整数(DWORD)而且不大于$00FFFFFF)
公式: a*x mod b=c;由于偶比较苯,采用的是循环方式既
function fn(a,b,c:dword):dword;
var x:dword;
begin
  for x:=0 to $00FFFFFF do begin
     if (a*x mod b)=c then break; 
  end;
  result:=x;
end;
但效率太低,哪位大虾有快速的方式请告知,谢谢

解决方案 »

  1.   

    我看改进的方法只能是在循环的外面做控制了
    如:
    function fn(const a, b, c: DWord): DWord;
    var
      x: DWord;
    begin
      Result := $01000000;  if (c > b - 1) or
        ((c <> 0) and (a mod b = 0)) then Exit;  for x := 0 to $00FFFFFF do
        if (a * x mod b) = c then
        begin
          Result := x;
          Break;
        end;
    end;由公式:a * X mod b = c可以得知:
    1. 0 <= c <= b-1
    2. 当a mod b=0时,也就是说a为b的倍数,
      那么当c<>0时,是没有结果的其它的情况我也没有总结,请楼主自行总结吧!
      

  2.   

    是我说的不太严谨,条件说的不明确可能出现没解的情况.a和b为固定数值(特定情况下也会变,但不会出现无解情况)
    a:=$7B38; b:=$01F44F; c为变量
      

  3.   

    重发一遍题目,请各位帮帮忙,谢谢急用已知a,b,c三数,求此x的最小值.(abcx均为正整数(DWORD))
    公式: a*x mod b=c;  
    数值范围 a<=$000FFFFF;  b<=$00FFFFFF; c<=$0000FFFF; x<=$00FFFFFF;
    其中a,b为一组固定数据( 如a:=$7B38;  b:=$01F44F; ),且(a mod b)<>0.由于偶比较苯,采用的是循环方式既
    function fn(a,b,c:dword):dword;
    var x:dword;
    begin
      for x:=0 to $00FFFFFF do begin
         if (int64(a*x) mod b)=c then break; //可能不需要加int64
      end; 
      result:=x;
    end;如  a:=$7B38;   b:=$01F44F;   c:=$4C1D;    则x:=$DE42;
    需要循环$DE42次,而且有大量的数据需要处理,效率会很低,哪位大虾有快速方式来解决一下,谢谢