Другие языки программирования и технологии

Объясните задачу (математика/программирование).

Есть задача по программированию
На клетчатой бумаге Петя нарисовал отрезок из точки с координатами (a,b) в точку с координатами (c,d). Через сколько клеток проходит этот отрезок (считается, что отрезок проходит через клетку, если он проходит через ее внутренность, если же он проходит только через вершину или по границе клетки, считается, что он не проходит через клетку).

Я нашёл решение.
var
a, b, c, d, s, m, n, t: integer;

begin
writeln('koordinaty 1 tochki:');
readln(a, b);
writeln('koordinaty 2 tochki:');
readln(c, d);
m := abs(a - c);
n := abs(b - d);
s := m + n;
while (n <> 0) and (m <> 0) do
begin
if n > m then n := n mod m else m := m mod n;
writeln('M=', m, ' N=', n);
end;
t := m + n;
s := s - t;
writeln('kletok=', s);
readln;
end.

Но я не могу понять, как так получилось?
Первое: Нашли решение не вы!
Второе:

var
a, b, c, d, s, m, n, t: integer;

begin
writeln('koordinaty 1 tochki:');
readln(a, b);
writeln('koordinaty 2 tochki:');
readln(c, d);
m := abs(a - c);
n := abs(b - d);
s := m + n;
while (n <> 0) and (m <> 0) do вот этот цикл находит наибольший общий делитель для чисел m и n
begin алгоритм Евклида который
if n > m then n := n mod m else m := m mod n;
writeln('M=', m, ' N=', n); А вот это вы для себя вывели что бы понять что же все таки здесь происходит, но так и не поняли
end;
t := m + n; Тут складывают НОД с последним числом деленным на него
s := s - t; А тут чистая математика. Из суммы m+n вычитают t, надо бы нарисовать на бумажке и понять как туда НОД впихнули и вообще действует ли такой подход. Но лень.
writeln('kletok=', s);
readln;
end.
Алесандр Варавко
Алесандр Варавко
15 389
Лучший ответ
Нурлан Букенбаев Я нашёл решение в интернете. Я бы не смог решить задачу, не понимая как это делать)))
берете конкретные числа и ведете расчет. думаю увидите смысл, если с математикой не беда
Роман Токарев
Роман Токарев
99 139
Нурлан Букенбаев В том-то и дело. Я программу полностью понимаю. С этим нет проблем, а вот как расчёт делается (почему так с математической точки зрения) я не понимаю. Буду благодарен хоть за тему по математики, которая связана с этим.
Нурлан Букенбаев Да хрен знаю. Затупа у меня.
Нурлан Букенбаев Ну так объяснишь?
Роман Горбунов лень писать прогу... суть:
если а-с* или б-д* =0 то 0
если а-с=б-д то а-с*
в противном случае (а-с) +(б-д) -1
*разницу в координатах брать по модулю
лень писать прогу... суть:
если а-с* или б-д* =0 то 0
если а-с=б-д то а-с*
в противном случае (а-с) +(б-д) -1
*разницу в координатах брать по модулю

в твоей проге на нечетных затык получается... допустим m=5 и n=2 клеток по проге 4, а в реале 6... мой вариант правильней
SS
Sardor Saidov
4 587
Алесандр Варавко если а-с* или б-д* =0 то 0
А если линия горизонтальная или вертикальная то у нее одно из этих значений a-c или b-d будет нулем, но при этом отрезок будет равен b-d или a-c соответственно.
Нурлан Букенбаев Если брать значения m=6, n=4, то по алгоритму получиться 9. Так?