Другие языки программирования и технологии
Программирование на Паскале Помогите, пожалуйста , написать программу на паскале
Сократить дробь a/b (a, b – введенные натуральные числа), используя рекурсивную функцию нахождения наибольшего общего делителя двух натуральных чисел
var a, b, c: int64;
function gcd(x, y: int64): int64;
var z: int64; begin z := x mod y;
if z = 0 then gcd := y else
gcd := gcd(y, z) end;
begin write('a b » '); readln(a, b);
c := gcd(a, b); if c = 1 then
writeln('Дробь несократимая!') else
a := a div c; b := b div c;
writeln(a, '/', b) end.
function gcd(x, y: int64): int64;
var z: int64; begin z := x mod y;
if z = 0 then gcd := y else
gcd := gcd(y, z) end;
begin write('a b » '); readln(a, b);
c := gcd(a, b); if c = 1 then
writeln('Дробь несократимая!') else
a := a div c; b := b div c;
writeln(a, '/', b) end.
Rustem Nigmatulin
if c = 1 then ...else лучше убрать.
Назовем функцию nod(c, d) и реализуем ее по оптимизированному алгоритму Евклида: вместо вычитания будем использовать деление по модулю, для больших чисел так быстрее.
Если c = d, тогда оба числа равны общему делителю, берем любое из них:
nod := c;
В противном случае надо большее поделить на меньшее и остаток от деления использовать вместо большего.
Если c > d, тогда nod := nod(c mod d, d); {Рекурсивный вызов функции nod}
Если c < d, тогда nod := nod(c, d mod c);
function nod(c: integer; d: integer): integer;
begin
if c = d then nod := c
else if c > d then nod := nod(c mod d, d)
else nod := nod(c, d mod c);
end;
А в основной программе просто считываем a и b, кладем их nod(a, b) в переменную n и выводим дробь, сокращенную на n:
WriteLn(a div n, ' / ', b div n);
Всё. Программу целиком писать не буду, не ленитесь :)
Если c = d, тогда оба числа равны общему делителю, берем любое из них:
nod := c;
В противном случае надо большее поделить на меньшее и остаток от деления использовать вместо большего.
Если c > d, тогда nod := nod(c mod d, d); {Рекурсивный вызов функции nod}
Если c < d, тогда nod := nod(c, d mod c);
function nod(c: integer; d: integer): integer;
begin
if c = d then nod := c
else if c > d then nod := nod(c mod d, d)
else nod := nod(c, d mod c);
end;
А в основной программе просто считываем a и b, кладем их nod(a, b) в переменную n и выводим дробь, сокращенную на n:
WriteLn(a div n, ' / ', b div n);
Всё. Программу целиком писать не буду, не ленитесь :)
Александр Павлов
Спасибо за решение :)
Похожие вопросы
- Помогите пожалуйста написать программу в Паскале )) Написать программу для вычисления суммы в массиве из 10 элементов
- Помогите, пожалуйста, написать программу на Паскале хотя бы примерно
- Помогите пожалуйста написать программу для Паскаля
- Помогите пожалуйста написать программу на паскале:
- помогите, пожалуйста, написать программу в паскале! сложные циклы.
- Срочно.Помогите пожалуйста написать программу на паскале.
- Помогите пожалуйста создать программу на Паскале. Заранее всем благодарен
- Помогите пожалуйста написать программу на языке программирования AssemblerКто первый поможет сделать правильно10балов+50
- люди добрые помогите мне написать программу в паскале, метод Рунге Кутта. Математическое решение есть у меня
- помогите пожалуйста составить программу в паскале