Форум по 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, 20:56
d_e_x_t_e_r d_e_x_t_e_r вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 10
Репутация: 10
По умолчанию

BoRoV, спасибо за наводку, компонент скачал и установил, но вот с описанием проблемы... нигде не могу найти описание на русском (к великому стыду вынужден признать, что буржуйскими языками не владею)... Подскажите как мне всетаки реализовать решение уравнения с помощью этой библиотеки?
Ответить с цитированием
  #9  
Старый 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" должно быть не равно нулю
__________________
Меня греют ваши плюсы к моей репутации...
Ответить с цитированием
  #10  
Старый 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)... Вот я и заморочился с возведением в большую степень...
Ответить с цитированием
  #11  
Старый 21.12.2010, 22:10
Аватар для BoRoV
BoRoV BoRoV вне форума
Начинающий
 
Регистрация: 08.09.2008
Сообщения: 193
Репутация: 12694
По умолчанию

Это со свойств делния на ноль дельти нельзя. Потому если "а" будет нулем, то решений не будет. А со свойст степеней мы получаем, что a^-1 = 1/a, дальше с умнодения дробей получим, что 1/a*(c-b) = (c-b)/a.

Ещё так как мы знаем, что у = 256 всегда , тогда можно заменить mod y на and $FF.
__________________
Меня греют ваши плюсы к моей репутации...
Ответить с цитированием
  #12  
Старый 22.12.2010, 17:53
LMA LMA вне форума
Прохожий
 
Регистрация: 14.12.2010
Сообщения: 25
Репутация: 10
По умолчанию

Цитата:
Сообщение от BoRoV
Это со свойств делния на ноль дельти нельзя. Потому если "а" будет нулем, то решений не будет. А со свойст степеней мы получаем, что a^-1 = 1/a, дальше с умнодения дробей получим, что 1/a*(c-b) = (c-b)/a.

Ещё так как мы знаем, что у = 256 всегда , тогда можно заменить mod y на and $FF.

$FF Это константа?
__________________
Если ты споришь с идиотом, вероятно тоже самое делает и он.
Ответить с цитированием
  #13  
Старый 22.12.2010, 17:55
LMA LMA вне форума
Прохожий
 
Регистрация: 14.12.2010
Сообщения: 25
Репутация: 10
По умолчанию

Меня греют ваши плюсы к моей репутации... и потом как поставить + ?
__________________
Если ты споришь с идиотом, вероятно тоже самое делает и он.
Ответить с цитированием
  #14  
Старый 22.12.2010, 19:02
Аватар для BoRoV
BoRoV BoRoV вне форума
Начинающий
 
Регистрация: 08.09.2008
Сообщения: 193
Репутация: 12694
По умолчанию

Да, это константа.

Плюсы ставить с помощью весов в правом углу поста.
__________________
Меня греют ваши плюсы к моей репутации...
Ответить с цитированием
  #15  
Старый 22.12.2010, 19:38
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

BoRoV, не пудри человеку мозги
$FF - это запись числа в шестнадцатеричной системе. То-есть, $1 - это 1, $A - это 10, $F - 15, а $FF - 255.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter