Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.12.2010, 12:45
d_e_x_t_e_r d_e_x_t_e_r вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 10
Репутация: 10
Вопрос Возвести число в большую степень...

Друзья, подскажите, как можно возвести число 255 в степень 255? Ни в какой тип данных не помещается...
Ответить с цитированием
  #2  
Старый 21.12.2010, 12:56
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
Edit1.Text:=FloatToStr(Power(255, 255));
всего то 4,65313883449837E613
Цитата:
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 21.12.2010, 18:48
d_e_x_t_e_r d_e_x_t_e_r вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 10
Репутация: 10
По умолчанию

NumLock, спасибо конечно, но это-то я и так знаю... просто не верно сформулировал вопрос... Мне целочисленный тип нужен... А вот на FloatToInt компилятор матюками ругается, говорит, что нет такого...

Последний раз редактировалось d_e_x_t_e_r, 21.12.2010 в 18:52.
Ответить с цитированием
  #4  
Старый 21.12.2010, 19:01
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Тогда надо возводить в степень самому. А так как в тип Integer или LongInt не поместиться, то нужно работать со строкой... как-то так:
Код:
type
  TMathArray = array of integer;

type
  TNumber = record
    int, frac: TMathArray;
    sign: boolean;
  end;

procedure Str2Number(s: string; var n: TNumber);
var
  i, j, l: integer;
begin
  if s = '' then
  begin
    setlength(n.int, 0);
    setlength(n.frac, 0);
    exit;
  end;
  l := length(s);
  if s[1] = '-' then
  begin
    s := copy(s, 2, l);
    l := l - 1;
    n.sign := false;
  end
  else
    n.sign := true;
  j := pos('.', s);
  if j > 0 then
  begin
    setlength(n.int, j - 1);
    for i := 1 to j - 1 do
      n.int[i - 1] := strtoint(s[j - i]);
    setlength(n.frac, l - j);
    for i := 1 to l - j do
      n.frac[i - 1] := strtoint(s[l - i + 1]);
  end
  else
  begin
    setlength(n.int, l);
    for i := 1 to l do
      n.int[i - 1] := strtoint(s[l - i + 1]);
    setlength(n.frac, 0);
  end;
end;

function Num2Array(var n: TNumber; var a: TMathArray): integer;
var
  i: integer;
begin
  result := length(n.frac);
  setlength(a, length(n.int) + result);
  for i := 0 to length(a) - 1 do
    if i < result then
      a[i] := n.frac[i]
    else
      a[i] := n.int[i - result];
end;

procedure Array2Num(var n: TNumber; var a: TMathArray; frac: integer; sign:
  boolean);
var
  i: integer;
begin
  setlength(n.frac, frac);
  setlength(n.int, length(a) - frac);
  for i := 0 to length(a) - 1 do
  begin
    if i < frac then
      n.frac[i] := a[i]
    else
      n.int[i - frac] := a[i];
  end;
  n.sign := sign;
end;

procedure DisposeNumber(var n: TNumber);
begin
  setlength(n.int, 0);
  setlength(n.frac, 0);
end;

function Number2Str(var n: TNumber): string;
var
  i: integer;
  s: string;
begin
  result := '';
  for i := 0 to high(n.int) do
    result := inttostr(n.int[i]) + result;
  if length(n.frac) <> 0 then
  begin
    for i := 0 to high(n.frac) do
      s := inttostr(n.frac[i]) + s;
    result := result + '.' + s;
  end;
  while (length(result) > 1) and (result[1] = '0') do
    delete(result, 1, 1);
  if pos('.', result) > 0 then
    while (length(result) > 1) and (result[length(result)] = '0') do
      delete(result, length(result), 1);
  if not n.sign then
    result := '-' + result;
  setlength(n.int, 0);
  setlength(n.frac, 0);
end;

procedure MultiplyArray(var a1, a2, a: TMathArray);
var
  i, j: integer;
  b: boolean;
begin
  {checking for zero, 1}
  for i := length(a2) - 1 downto 0 do
  begin
    for j := length(a1) - 1 downto 0 do
    begin
      a[j + i] := a[j + i] + (a2[i] * a1[j]);
    end;
  end;
  repeat
    b := true;
    for i := 0 to length(a) - 1 do
      if a[i] > 9 then
      begin
        b := false;
        try
          a[i + 1] := a[i + 1] + 1;
        except
          setlength(a, length(a) + 1);
          a[i + 1] := a[i + 1] + 1;
        end;
        a[i] := a[i] - 10;
      end;
  until b;
end;

function MyPower(First, Second: string): string;
var
  i, j, c: integer;
  a, a1, a2: TMathArray;
var
  n1: TNumber;
  max: integer;
begin
  j := strtoint(Second);
  if j = 0 then
  begin
    result := '1';
    exit;
  end
  else if j = 1 then
  begin
    result := First;
    exit;
  end;

  max := j - 1;
  Str2Number(First, n1);
  c := Num2Array(n1, a1);
  setlength(a, 0);
  setlength(a2, 0);
  a2 := a1;
  for i := 1 to j - 1 do
  begin
    if Assigned(OnProgress) then
      OnProgress((i / max) * 100);
    setlength(a, 0);
    setlength(a, length(a1) + length(a2) + 1);
    MultiplyArray(a1, a2, a);
    setlength(a2, 0);
    a2 := a;
  end;
  setlength(a1, 0);
  setlength(a2, 0);
  c := c * j;
  if n1.sign then
    Array2Num(n1, a, c, true)
  else if odd(j) then
    Array2Num(n1, a, c, false)
  else
    Array2Num(n1, a, c, true);
  setlength(a, 0);
  result := Number2Str(n1);
  DisposeNumber(n1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  memo1.Clear;
  memo1.Lines.Add(MyPower('255','255'));
end;
ЗЫ ответ помещаю в мемо, т.к. слишком большое число получается
__________________
Помогаю за Спасибо
Ответить с цитированием
  #5  
Старый 21.12.2010, 19:18
d_e_x_t_e_r d_e_x_t_e_r вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 10
Репутация: 10
По умолчанию

Мне нужно реализовать формулу x=(a^-1)*(c-b) mod y, где y=256, a, с и b - целые числа от 0 до 255.. а в минус первой степени... х получиться должно число от 0 до 255...

Последний раз редактировалось d_e_x_t_e_r, 21.12.2010 в 19:21.
Ответить с цитированием
  #6  
Старый 21.12.2010, 19:20
d_e_x_t_e_r d_e_x_t_e_r вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 10
Репутация: 10
По умолчанию

О! Пока писал появился вектор для поиска... Сейчас изучу и попробую понять суть... Спасибо!
Ответить с цитированием
  #7  
Старый 21.12.2010, 19:42
Аватар для BoRoV
BoRoV BoRoV вне форума
Начинающий
 
Регистрация: 08.09.2008
Сообщения: 193
Репутация: 12694
По умолчанию

Модуль для больших чисел FGInt.
__________________
Меня греют ваши плюсы к моей репутации...
Ответить с цитированием
  #8  
Старый 21.12.2010, 21:13
Аватар для BoRoV
BoRoV BoRoV вне форума
Начинающий
 
Регистрация: 08.09.2008
Сообщения: 193
Репутация: 12694
По умолчанию

Использовать несложно, но с твоего уравнения видно, что нам не придется возводить в такую степень:
Цитата:
Сообщение от d_e_x_t_e_r
Мне нужно реализовать формулу x=(a^-1)*(c-b) mod y, где y=256, a, с и b - целые числа от 0 до 255.. а в минус первой степени... х получиться должно число от 0 до 255...

Всего навсего это будет выглядеть так:
Код:
x := (c - b) div a mod y; // "a" должно быть не равно нулю
__________________
Меня греют ваши плюсы к моей репутации...
Ответить с цитированием
  #9  
Старый 21.12.2010, 22:01
d_e_x_t_e_r d_e_x_t_e_r вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 10
Репутация: 10
По умолчанию

Вот дело как раз в том, что а может быть нулем (но не меньше)... Видимо условие придется прописать
Код:
if a>0 then
 begin
  x := (c - b) div a mod y;
 end
else
 begin
  x := (c - b) mod y;
 end;
Правильно? Я просто сейчас с чужого компа и проверить не могу... Мне видимо неверно подсказали что сначало нужно сделать так: a^-1 mod y = a^y-1 mod y... а это возведение в степень 255 (исходя из того, что начальное значение у 256)... Вот я и заморочился с возведением в большую степень...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:30.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter