Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2011, 15:41   #1
Zibiv
Пользователь
 
Регистрация: 27.09.2008
Сообщений: 64
Печаль длинная арифметика, возведение в степень

Ребята подскажите пожалуйста где ошибка зарыта...

Код:
var
  f: array[1..5,1..210] of Integer;
  i, j, q, k, n, d, z, kk: integer;


begin
d:=StrToInt(edt2.Text);//то что возводим
n:=StrToInt(edt4.Text);// во что возводим
i:=210;
k:= i;
while d>0 do
begin
f[1,i]:=d mod 10;
d := d div 10;
i := i - 1;
end;
for j := 1 to k do
begin
f[2, j] := f[1, j];
end;
for q := 1 to n - 1 do
begin
j := k;
z := 0;
while j > 1 do
begin
f[3, j] := (f[1, j] * f[2, k] mod 10) + z;
z := f[1, j] * f[2, k] div 10;
j := j - 1;
end;
z := 0;
for j := k downto 1 do
begin
f[5, j] := (f[3, j] + f[4, j] + z) mod 10;
z := (f[3, j] + f[4, j] + z) div 10;
end;
for j := 1 to k do
begin
f[1, j] := f[5, j];
f[5, j] := 0;
end;
for j := 1 to k do
begin
if f[1, j] = 0 then
begin
kk := kk + 1
end
end;
end;

for j := kk + 1 to k do
begin
re:=(f[1,j]);
end;
edt1.Text:=IntToStr(re);// вывод результата
end;
получается три edit'a в два из них вводятся числа, в третьем результат возведения в степень, так как числа большие поэтому создан массив и возведение в степень грубо говоря происходит в столбик...

Проблема в том, что оно-зараза)) неправильно выводит результат в edt1... Причем только при первом нажатии кнопки выводит, потом жми не жми меняй числа которые возводятся в степень, результат в edt1 не меняется.. Вообще алгоритм писался когда то на паскаль и на нем оно работает правильно, а на Delphi, хоть убейся, уже хочется свежих идей и нового взгляда со стороны)

P.S.: числа одно их которых возводится в степень, а другое взводит, генерируются рандомно

Код:
Var
 intA  : Integer;
begin
      Randomize;
    intA:=5+Random(10);
    edt4.text:=IntToStr(intA);
end;
одно из чисел...
Zibiv вне форума Ответить с цитированием
Старый 28.05.2011, 20:42   #2
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

как насчет использования Power ???
что то наподобие этого :
Код:
d:=StrToInt(edt2.Text);//то что возводим
n:=StrToInt(edt4.Text);// во что возводим
r:=Power(d,n);   { d в степени n     }
Edit3.Text:=IntToStr(r);
насколько я понял условие... если не то то напиши само условие...
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 28.05.2011, 21:14   #3
Zibiv
Пользователь
 
Регистрация: 27.09.2008
Сообщений: 64
По умолчанию

У меня два больших числа которые) одно возводится в степень другого, и делится на третье большое число и берется остаток.... например (432^678) mod 987, я уже чего только не перепробовал... дело в том если использовать тип данных real, Extended и т.п. потом не сделать mod)
Если предложите другой рабочий алгоритм выдающий правильный ответ по формуле (a^b) mod c, я буду не против)

Последний раз редактировалось Zibiv; 28.05.2011 в 21:23.
Zibiv вне форума Ответить с цитированием
Старый 28.05.2011, 23:14   #4
Zibiv
Пользователь
 
Регистрация: 27.09.2008
Сообщений: 64
По умолчанию

Тема закрыта. все решено)
Zibiv вне форума Ответить с цитированием
Старый 28.05.2011, 23:20   #5
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

делай свой mod
возводишь в степень..
и дальше отнимай от возведенного свое третье число... до тех пор покуда оно не станет меньше третего числа.... что то подобное:

Код:
  begin
 a:=135;
 b:=257;
c:=1;
d:=4683;
for i:=1 to b do
c:=c*a;
repeat
c:=c-d;
writeln (c);
until (c<d);

writeln (c);

end.

крайне медленно... но точно))))
что нить ещё можно придумать с отнятием в цикле ... для ускорения работы.... напримерн возвести тоже в какую нибудь немалую степень... и потом збавлять обороты....
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 28.05.2011, 23:39   #6
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
Смех

немного подумав написал такой вот алгоритм:
Код:
var
  i,a,b,c,e,d,z:int64;
  
  begin
 a:=11; // число которое возводиться в степень
 b:=2;   // степень... в которую возводиться число a
c:=1;
d:=100;  // делитель... от которого находим остаток...
for i:=1 to b do
c:=c*a;
writeln(c);

for z:=1 to b do 
begin
e:=1;
for i:=1 to b-z+1 do
e:=e*d;
if c>e then 
begin
repeat
c:=c-e;
writeln (c);
until (c<e);
end;
end;

writeln (c);

end.
тестил на небольших числах - все норм... поставь extended и проверь... должно пойти... в паскале попросту нету такого типа.... а на int64 не сильно разгонишься....
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 28.05.2011, 23:40   #7
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

кинь свой код... коль решено)))) для просмотра)
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длинная арифметика nervniy Общие вопросы Delphi 4 19.04.2011 23:18
Длинная арифметика на C++ Kingdom_Reborn Помощь студентам 0 06.04.2011 22:32
Длинная арифметика. Steam.dll Помощь студентам 8 03.04.2011 17:47
Длинная арифметика Khelleos Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 20.12.2010 09:08