Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
SaLoMoN
0 / 0 / 0
Регистрация: 17.11.2011
Сообщений: 91
#1

Процедуры. Сократить дробь - Turbo Pascal

05.06.2012, 14:25. Просмотров 2083. Ответов 10
Метки нет (Все метки)

2)Даны два натуральных числа a и b, обозначающие соотвестветнно числитель и знаменатель дроби.сократить дробь,т.е. Найти такие натуральные числа p и q, не имеющие общих,делителей ,что p/q=a/b.(Определить функцию для расчета наибольшего общего делителя двух натуральных чисел,используя алгоритм Евклида).(по теме "Функции и процедуры")
http://www.cyberforum.ru/turbo-pascal/thread690024.html

Помогите народ пожалуйста
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2012, 14:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Процедуры. Сократить дробь (Turbo Pascal):

Сократить дробь
Требуется ее сократить, то есть записать это же число в виде , где c — целое...

Определить сократимую дробь и сократить
Друзья помогите пожалуйста! С клавиатуры вводятся целые числа попарно. 1-ое...

Сократить дробь, чтобы числитель и знаменатель были взаимнопростые
Даны два натуральных числа :m,n (1..9999),образующие дробь вида m/n. ократить...

Сократить дробь т.е. найти такие натуральные числа p и q не имеющие общих делителей
Даны натуральные числа a и b, обозначающие соответственно числитель и...

Даны числа, представляющие числитель и знаменатель некоторой дроби. Сократить эту дробь
Всем доброго времени суток!! Решите задачу)) Даны натуральные числа т и п,...

10
КонецСвета
Почетный модератор
7928 / 3899 / 2464
Регистрация: 30.10.2011
Сообщений: 5,379
05.06.2012, 16:43 #2
Лучший ответ Сообщение было отмечено как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
uses crt;
var a,b,p,q: integer;
 
function NOD (x,y: integer): integer;
begin
while x<>y do
      if x>y then x:=x-y else y:=y-x;
NOD:=x;
end;
 
begin
write('  Числитель: '); readln(a);
write('Знаменатель: '); readln(b);
p:=a div NOD (a,b);
q:=b div NOD (a,b);
writeln (a:5,' ':7,p:4);
writeln('------- =  -------');
writeln (b:5,' ':7,q:4);
readln;
end.
3
SaLoMoN
0 / 0 / 0
Регистрация: 17.11.2011
Сообщений: 91
05.06.2012, 16:56  [ТС] #3
Спасибо тебе конец света выручил огромное спасибо буду обращаться теперь)
0
route66
492 / 425 / 56
Регистрация: 29.04.2011
Сообщений: 443
11.07.2012, 20:30 #4
Функция хорошая (спасибо за нее), но в некоторых случаях работает некорректно. Вот один из них:

3253912283381760000 / 9490577493196800000 = 12 / -33

Хотя должно быть 12/35.

Тестил в pascalabc, целочисленный тип: uint64.
1
КонецСвета
Почетный модератор
7928 / 3899 / 2464
Регистрация: 30.10.2011
Сообщений: 5,379
11.07.2012, 20:43 #5
route66, в версии 1.8 PascalABC.NET после изменения всех integer на uint64 по вашим данным выдает правильный ответ (12/35)
проверьте:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var a,b,p,q: uint64;
 
function NOD (x,y: uint64): uint64;
begin
while x<>y do
      if x>y then x:=x-y else y:=y-x;
NOD:=x;
end;
 
begin
write('  Числитель: '); readln(a);
write('Знаменатель: '); readln(b);
p:=a div NOD (a,b);
q:=b div NOD (a,b);
writeln (a:5,' ':7,p:4);
writeln('---------- =  ----------');
writeln (b:5,' ':7,q:4);
readln;
end.
1
CodeR
Фрилансер
3379 / 2781 / 2999
Регистрация: 08.02.2012
Сообщений: 6,647
Записей в блоге: 1
11.07.2012, 21:50 #6
Цитата Сообщение от КонецСвета Посмотреть сообщение
route66, в версии 1.8 PascalABC.NET после изменения всех integer на uint64 по вашим данным выдает правильный ответ (12/35)
Подтверждаю всё правильно...

Не по теме:

И что это за извращение...

1
route66
492 / 425 / 56
Регистрация: 29.04.2011
Сообщений: 443
11.07.2012, 23:26 #7
Цитата Сообщение от КонецСвета Посмотреть сообщение
route66, в версии 1.8 PascalABC.NET после изменения всех integer на uint64 по вашим данным выдает правильный ответ (12/35)
проверьте:
Спасибо за ответ! У меня pascalabc 1.5, похоже пора обновляться)
Ошибку обнаружил в ходе выполнения расчетного задания со случайными входными данными.
вот скрин:
0
Миниатюры
Процедуры. Сократить дробь   Процедуры. Сократить дробь  
КонецСвета
Почетный модератор
7928 / 3899 / 2464
Регистрация: 30.10.2011
Сообщений: 5,379
11.07.2012, 23:34 #8
route66, можете выложить код / часть кода / процедуру? ... вдруг дело все-таки не в версии...
0
route66
492 / 425 / 56
Регистрация: 29.04.2011
Сообщений: 443
11.07.2012, 23:40 #9
исправил формат, чтобы все числа вошли
0
Миниатюры
Процедуры. Сократить дробь  
КонецСвета
Почетный модератор
7928 / 3899 / 2464
Регистрация: 30.10.2011
Сообщений: 5,379
12.07.2012, 00:01 #10
route66, проблему удалось решить заменой функции целочисленного деления div на функцию программиста (вероятно, в старой версии PascalABC div не очень ладит с типом uint64)
но вы еще раз проверьте, на всякий... к ночи за логику свою не поручусь...
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var a,b,p,q: uint64;
 
function NOD (x,y: uint64): uint64;
begin
while x<>y do
      if x>y then x:=x-y else y:=y-x;
NOD:=x;
end;
 
function Z4D (x,y: uint64): uint64;
var r: uint64;
begin
r:=1;
while x>y do
    begin
    r:=r+1;
    x:=x-y;
    end;
Z4D:=r;
end;
 
begin
a:=3253912283381760000;
b:=9490577493196800000;
p:=Z4D(a,NOD (a,b));
q:=Z4D(b,NOD (a,b));
writeln (a,' ':7,p:4);
writeln('---------- =  ----------');
writeln (b,' ':7,q:4);
readln;
end.
1
route66
492 / 425 / 56
Регистрация: 29.04.2011
Сообщений: 443
12.07.2012, 13:19 #11
КонецСвета, отличная работа! проверил - теперь работает как надо. а pascalabc все-таки обновлю до 1.8.
0
12.07.2012, 13:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2012, 13:19
Привет! Вот еще темы с решениями:

Сократить дробь
Тема: Процедуры пользователя Сократить дробь вида a/b (a, b – вводимые...

Умножить дробь на дробь и получить ответ в виде несократимой дроби
Даны две дроби A/B и C/D (где А, В, С, D — натуральные числа). Умножить дробь...

Использование имени процедуры в качестве параметра другой процедуры
Предложите, пожалуйста, пример решения след. задачи с использованием...

Использование имени процедуры в качестве параметра другой процедуры
Help! Для массива С из n элементов составить процедуру, которая находит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru