Показать сообщение отдельно
  #3  
Старый 05.09.2014, 12:55
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Непонятно зачем это надо, но, если число меньше чем 2^x то его "бинарный размер" = x
спасибо конечно, но это будет работать ещё дольше приведенного мною кода, и уж поверьте об этом и о различным ускоряющих модификациях вашего подхода я догадался, но суть в том что задачу эту можно выполнить намного быстрее чтением бинарной памяти, которым я к сожалению не владею, так как она скорее всего реализовывается через вставки asm вот в этом мне нужна помошь.

Код:
  function GetCount(const Base:byte;X:Int64):cardinal;
  var
    z:int64;
    zp:cardinal;
    Base3:cardinal;
    xx:int64;
  begin
    Result:=0;
    Base3:=Base*Base*base;
    xx:=0;
    while X>0 do
    begin
      z:=1;
      zp:=0;
      while X>=Z do
      begin
        Z:=Z*base3;
        xx:=X;
        X:=X div Z;
        inc(zp,3);
        inc(Result,zp);
      end;
    end;
    if(xx<>0)and(X=0)then
    begin
      Z:=Z div (Base*Base);
      xx:=xx div Z;
      if(xx=0)then
        dec(Result,2)
      else
      if(xx<base)then
        dec(Result,1);
    end;
  end;

вот что пока получилось навоять, 10 000 000 значений максимального DWord - овского числа за 3 секунды определяет длину, но это не правильный подход и изврат, помогите с asm
Ответить с цитированием