Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на длинную арифметику. Помогите!
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
SSJ
Помогите пожалуйста, у меня задача: Написать программу для вычисления корня квадратного из огромного числа( количество цифр в нем n,n>40) при условий что корень извлекается т.е. он целое число. Я нашел алгоритм чисто математический, суть его разбитие на грани и.., вопщем у меня не получается написать на паскале нормально работающую прогу. Я тут смотрел вроде была тема длинная арифметика и там были разобраны некоторые задачи но моей не было. И НИГДЕ в инете кода этой задачи нет. Подмогните!
volvo
Ну, насчет "нигде" - это ты не прав... Вот, например, библиотека BigInt, в которой реализовано нахождение корня длинного числа: http://www.mi.unicyb.kiev.ua/downloads/acm.../c/BigInteger.c

(то, что она написана на С++, еще не значит, что это же нельзя реализовать на Паскале... Справишься, или нужна помощь?)
SSJ
Volvo, если тебе не сложно, напиши ты.

__
p.s
и ваабще тебе чисто человеческий респект, я смотрю ты тут многим помогаешь

p.р.s.
Еще хотел спросить ты по asm шаришь, если да то не знаешь алгоритма или мануала по взлому star force, если че сам кречил,то давай по асе свяжимся и ты расскажишь
volvo
Здесь: http://volvo71.narod.ru/progs/big_int.rar
SSJ
Volvo, эта прога с твоего сайта странно работает она к примеру из числа 138384 не верно считает корень ды и не только для него...
Если ты можешь загляни сюда comp-science.hut.ru/dl-ar/dl-ar.html
и напиши прогу по этому мат алгоритму. Я могу выложить то что я пока сделал но не знаю поможет ли это.. Пожалуйста помоги а то у меня курсовик стоит, из 10 задач одна эта осталась.

Добавлено через 11 мин.
Цитата(SSJ @ 10.04.2007 21:21) *

Volvo, эта прога с твоего сайта странно работает она к примеру из числа 138384 не верно считает корень ды и не только для него...
Если ты можешь загляни сюда comp-science.hut.ru/dl-ar/dl-ar.html
и напиши прогу по этому мат алгоритму. Я могу выложить то что я пока сделал но не знаю поможет ли это.. Пожалуйста помоги а то у меня курсовик стоит, из 10 задач одна эта осталась.

Program KvadratniiKoren;

const
nmax=2000;

var
c,n,c2:array[1..nmax]of integer;

m,zt,c2i,a1s,cs,bbs,rezs,nj,nt,max0s,max1s:string;
mI,l,i,kolgr,j,code,max,max1,x,z,zz,ab1,am1,cc,rez,bm,bb,u:integer;
log:text;

begin

assign(log,'log.ssj_prog'); {очищаем файл}
rewrite(log);
close(log);


read(m);
l:=length(m);

for i:=1 to l do begin {заполняем массив с(числовой)из файла, по 1 символу(цифре) в ячейку массива}
val(m[i],mI,code);
c[i]:=mI; end;

if l mod 2 =0 then {если число цифр в введенном числе четное то по два числа в грани, если нечетное то первая слева грань имеет 1 цифру а все остальные по 2}

begin
writeln('кол-во цифр в числе четное ',l);
for i:=1 to l do begin
assign(log,'log.ssj_prog');
append(log);
writeln(log,m[i],m[i+1]);
i:=i+1;
close(log); end;

kolgr:=round(l/2); {определяем кол-во граней(групп по 2 цифры), ! число граней равно числу цифр исходеного числа}

writeln('В результате должно получиться число, длина которого ',kolgr,' цифр');


assign(log,'log.ssj_prog'); {заполняем массив с2(числовой)из файла, по 2 символа(цифре) в ячейку массива}
reset(log);
for j:=1 to kolgr do
readln(log,c2[j]);

close(log);
erase(log);

writeln('Вывожу введенное число с расстановленными гранями');
for j:=1 to kolgr do write(c2[j],' ');
writeln;



assign(log,'log.ssj_prog');
rewrite(log);
close(log);
nt:='';

for i:=1 to kolgr do
if i=1 then begin
for x:=1 to c2[1] do
if c2[1]>= sqr(x) then max:=x; {ищем число квадрат которого меньше или равен числу 1-ой грани}


assign(log,'log.ssj_prog');
append(log);
writeln(log,max);
close(log);

if kolgr>1 then begin

str(max,max0s);
nt:=nt+max0s;


z:=sqr(max);
zz:=c2[1]-z;
str(zz,zt);
str(c2[i+1],c2i);
a1s:=zt+c2i;
val(a1s,ab1,code);
am1:=2*max;

for x:=1 to ab1 do
if (10*am1+x)*x<=ab1 then max1:=x;

assign(log,'log.ssj_prog');
append(log);
writeln(log,max1);
close(log);

str(max1,max1s);
nt:=nt+max1s;

cc:=ab1-(10*am1+max1)*max1;


end;


for i:=3 to kolgr do begin
str(cc,cs);
str(c2[i],c2i);
bbs:=cs+c2i;
val(bbs,bb,code);


rezs:='';
for j:=1 to i do begin

rezs:=rezs+nt;

val(rezs,rez,code);

bm:=2*rez;
for x:=1 to bb do
if (10*bm+x)*x<=bb then max:=x;

cc:=bb-(10*bm+max)*max;

assign(log,'log.ssj_prog');
append(log);
writeln(log,max);
close(log);


end;
end;
end;


{результат пока выводит в файл}

end;
end.


volvo
Исправлено...
На сайте - новая версия программы...
Гость
Спасибо Volvo, все работает!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.