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

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

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

> вычитание через строки, длинная арифметика
Dain
сообщение 10.06.2007 11:19
Сообщение #1


Гость






как реализовать вычитание из числа a типа string чило b типа string

procedure sub( a,b:string; var c: string);
var
z,x,y,n,k,p,i,j: byte;
Begin
if a='0' then begin c:='0'; halt(0); end;
c:='';
n:= length (a);
k:= length (b);
for i:=1 to n+k do c:=c+'0';
for i:=k downto 1 do begin
p:=0; y:= ord (b[i])-ord('0');
for j:=n downto 1 do begin
x:= ord(a[j])-ord('0');


а дальше как ?помогите плз

Сообщение отредактировано: Dain - 10.06.2007 11:22
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 2)
volvo
сообщение 10.06.2007 12:07
Сообщение #2


Гость






Это не совсем "длинная арифметика", т.к. длина строки ограничена... Но делается вычитание в столбик вот так:

{ число представленное строкой A должно быть больше числа представленного B }
function sub(a, b: string): string;
var
c: string;
i, j, k: integer;
begin
while length(a) <> length(b) do
b := '0' + b;

c := '';
for i := length(a) downto 1 do begin
if a[i] >= b[i] then c := chr(ord(a[i]) - ord(b[i]) + ord('0')) + c
else begin
j := i;
repeat
dec(j);
until a[j] > '0';
a[j] := chr(ord(a[j]) - 1);
for k := j + 1 to i - 1 do a[k] := '9';
c := chr(ord(a[i]) + 10 - ord(b[i]) + ord('0')) + c;
end;
end;
sub := c;
end;

Для того, чтобы вычитать большее из меньшего и получать правильный отрицательный результат, можно, например, делать так:

function sub_s(a, b: string): string;
begin
if (length(a) < length(b)) or
((length(a) = length(b)) and (a < b)) then sub_s := '-' + sub(b, a)
else
sub_s := sub(a, b);
end;

begin

writeln(sub_s('745', '10003'));
end.


 К началу страницы 
+ Ответить 
Dain
сообщение 10.06.2007 12:17
Сообщение #3


Гость






Спасибо большое!
 К началу страницы 
+ Ответить 

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

 



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