IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Длинночисленная арифметика, Длинночисленная арифметика
Tay
сообщение 9.04.2005 14:49
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской

Репутация: -  0  +


Как решить задачу?
Найти отношение двух многозначных чисел.
P.S. Я просто не сталкивался с такими задачами.

Материал из FAQ:
деление двух длинных чисел :


Код
function FindBin(ost,b:Plong;const sp:integer):longint;
var up,down:word;
  c:Plong;
begin
 new(c);
 down:=0;up:=_osn;
 while up-1>down do
    begin
       MulLongShort(b,(up+down) div 2,c);
       case MoreSdvigLong(ost,c,sp) of
        0:down:=(up+down) div 2;
        1:up:=(up+down) div 2;
        2:begin
             up:=(up+down) div 2;
             down:=up;
          end;
       end;
    end;
 MulLongShort(b,(up+down) div 2,c);
 if MoreSdvigLong(ost,c,0)=0 then SubLongTwo(ost,c,sp) else
    begin
       SubLongTwo(c,ost,sp);
       ost:=c;
    end;
 FindBin:=(up+down) div 2;
 dispose(c);
end;



procedure MakeDel(a,b,res,ost:Plong);
var sp:integer;
begin
 ost^:=a^;
 sp:=a^[0]-b^[0];
 if MoreSdvigLong(a,b,sp)=1 then dec(sp);{!!!!!!!!!}
 res^[0]:=sp+1;
 while sp>=0 do
    begin
       res^[sp+1]:=FindBin(ost,b,sp);
       dec(sp);
    end;
end;



procedure DivLongTwo(a,b,res,ost:Plong);
begin
 fillchar(res^,sizeof(res^),0);res^[0]:=1;
 fillchar(ost^,sizeof(ost^),0);ost^[0]:=1;
 case MoreSdvigLong(a,b,0) of
  0:MakeDel(a,b,res,ost);
  1:ost^:=a^;
  2:res^[1]:=1;
 end;
end;

что бы разделить a на b вызовите : DivLongTwo(a,b,res,ost);
res -- результат деления a на b; ost -- остаток от деления.


--------------------
Никакие рассуждения не в состоянии указать человеку путь, которого он не хочет видеть.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 9.04.2005 15:40
Сообщение #2


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


И чтоне понятно? там же ясно написанно:

Цитата
что бы разделить a на b вызовите : DivLongTwo(a,b,res,ost);
res -- результат деления a на b; ost -- остаток от деления.


В чем трудность?


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tay
сообщение 9.04.2005 17:27
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской

Репутация: -  0  +


Цитата(Oleg_Z @ 9.04.05 16:40)
И чтоне понятно? там же ясно написанно:
В чем трудность?


Трудность в том что я не знаю Паскаль.
Я начал учить его несколько дней назад.И пока у меня мало что получается.
Препод по информатике выдал задачи, сказал для самостоятельного изучения. Еденственное что из лекций он нам дал это определение зарезервированных слов. Я пытась сам в TP7 разобратся но получается довольно медленно, а время поджимает.
Я плохо понимаю текс программы неговоря уже о том чтобы её дописать.


--------------------
Никакие рассуждения не в состоянии указать человеку путь, которого он не хочет видеть.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.04.2005 18:49
Сообщение #4


Гость






Tay,
без знания Паскаля (ну, или со знанием только зарезервированных слов) невозможно разобраться в длинночисленной арифметике, т.к. эта тема подразумевает хорошее знание языка, и в частности - указателей...

Это совершенно не подходящая для самостоятельного изучения тема...
 К началу страницы 
+ Ответить 
Atos
сообщение 9.04.2005 19:25
Сообщение #5


Прогрессор
****

Группа: Модераторы
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


Даействительно. Что-то не верится, чтобы такое давали первым заданием. Может всё-таки имелось в виду не длинночисленная арифметика? Tay, приведи, пожалуйста, точный текст задания.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tay
сообщение 9.04.2005 22:07
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской

Репутация: -  0  +


Цитата(Atos @ 9.04.05 20:25)
Даействительно. Что-то не верится, чтобы такое давали первым заданием. Может всё-таки имелось в виду не длинночисленная арифметика? Tay, приведи, пожалуйста, точный текст задания.


Задача: Найти отношение двух многозначных чисел(длиночисленная арифметика)

P.S. Не подумайте что я преувеличиваю. Наш препод работает чисто на деньги, его задача оставить все на последний день и вынудить нас ему заплатить. То же самое было в прошлом семестре, он на последней неделе выдал нам материал (Автокад, маткад, офис) и устроил нам зачет. Зачет не просто пользовательского режима но и мелких деталей которых без практики не узнаешь. В моей группе из 27 человек 21 заплатили. Я из принципа платить не стал и здал зачет с третьего раза, я выучил эти программы досконально ,и то мне повезло, когда я ему отчитывал к нам в аудиотрию зашел зав кафедры информатики и мой препод не смог ничего сделать. Хотели писать заяву на него к декану, но у нас все преподы по инорматике такие, уйдет он и на его место поставят другого (его друга) и нашей группе ........
Мы неоднократно всей группой просили консультации у него по этой теме(Длиночисленная арифметика), а он нам все твердит, что эта тема для самостоятельного изучения.

(Не подумайте что я преувеличиваю.)

Сообщение отредактировано: Tay - 9.04.2005 22:11


--------------------
Никакие рассуждения не в состоянии указать человеку путь, которого он не хочет видеть.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.04.2005 22:38
Сообщение #7


Гость






Tay, ну тогда попробуй прочитать вот это: Длинночисленная арифметика
Тут очень хорошо разъяснена (на примерах) работа с длинными числами. А понимание того, что делается в программе тебе понадобится для сдачи ... :yes:
 К началу страницы 
+ Ответить 
Tay
сообщение 9.04.2005 22:49
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской

Репутация: -  0  +


Спасибо это то что надо.


--------------------
Никакие рассуждения не в состоянии указать человеку путь, которого он не хочет видеть.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tay
сообщение 17.04.2005 18:44
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской

Репутация: -  0  +


Привет, это опять я. Я более или менее с прогой разобрался но никак не получается её до ума довести. Парни если не трудно допешите её до конечного варианта, а то мне в среду уже сдавать её нужно. Буду очень благодарен.


--------------------
Никакие рассуждения не в состоянии указать человеку путь, которого он не хочет видеть.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 17.04.2005 21:39
Сообщение #10


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


покажи то, до чего смог довести ее


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Tay
сообщение 22.04.2005 16:59
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской

Репутация: -  0  +


Цитата(Oleg_Z @ 17.04.05 22:39)
покажи то, до чего смог довести ее

Код
У меня прога пошла. Все ок.
program;
uses crt;
function sum(x,y:string):string;
var i:integer;
   lx,ly,yy,s:byte;
   res:string;
   mem:byte;
begin
 if length(x)<length(y) then
 begin
   res:=x;
   x:=y;
   y:=res;
 end;
 lx:=length(x);
 ly:=length(y);
 mem:=0;
 res:='';
 for i:=0 to lx-1 do
 begin
    if ly-i<1 then yy:=0
    else yy:=ord(y[ly-i])-48;
    s:=(ord(x[lx-i])-48)+yy+mem;
    res:=chr((s mod 10)+48)+res;
    mem:= s div 10;
 end;
 if mem>0 then res:=chr(mem+48)+res;
 sum:=res;
end;

function rasn(x,y:string):string;
var j,i:integer;
   lx,ly,xx,yy,s:byte;
   res:string;
   mem:byte;
begin
 lx:=length(x);
 ly:=length(y);
 mem:=0;
 res:='';
 for i:=0 to lx-1 do
 begin
    if ly-i<1 then yy:=0
    else yy:=ord(y[ly-i])-48;
    xx:=ord(x[lx-i])-48;
    if xx>=yy then res:=chr(xx-yy+48)+res
    else
    begin
      j:=lx-i-1;
      while (x[j]='0')and(j>0) do
      begin
        x[j]:='9';
        dec(j);
      end;
      dec(x[j]);
      res:=chr(10+xx-yy+48)+res;
    end;
 end;
 while (res[1]='0')and(length(res)>1)  do delete(res,1,1);
 rasn:=res;
end;

procedure chas(x, y :string; var res, ost:string);
begin
 res:='0';
 ost:=x;
 while (length(ost)>length(y)) or (ost>=y) do
 begin
   ost:=rasn(ost,y);
   res:=sum(res,'1');
 end;
end;

var
   sx, sy :string;
   key:char;
   r,o:string;
begin
  sx:='';
  sy:='';

  write('BBeguTe nepBoe 4uc/\o: ');
  repeat
  key:= readkey;
  if(key>='0')and(key<='9')then
  begin
     sx:=sx+key;
     write(key);
  end;
  until key=#13;
  writeln;
  write('BBeguTe Btopoe 4uc/\o: ');
  repeat
  key:= readkey;
  if(key>='0')and(key<='9')then
  begin
     sy:=sy+key;
     write(key);
  end;
  until key=#13;
  writeln;
  chas(sx,sy,r,o);
  writeln('4acTHoe= ',r,' octaTok= ',o);
  readln;
end.


Сообщение отредактировано: volvo - 22.04.2005 17:20


--------------------
Никакие рассуждения не в состоянии указать человеку путь, которого он не хочет видеть.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 6:30
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"