Форум по 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
По умолчанию

Код:
1
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 не поместиться, то нужно работать со строкой... как-то так:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
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...

Всего навсего это будет выглядеть так:
Код:
1
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
По умолчанию

Вот дело как раз в том, что а может быть нулем (но не меньше)... Видимо условие придется прописать
Код:
1
2
3
4
5
6
7
8
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, время: 01:11.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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