Мне не понятно, как это работает. Кто-нибудь может это объяснить?
Эквивалентность выглядит следующим образом:
a is the numerator vector of length n b is the denominator vector of length m
user1131467 10 сен ’12 в 21:31 2012-09-10 21:31
2012-09-10 21:31
2 ответа
init просто заполняет массив P чтобы P[i] содержит самый большой главный фактор i ,
f(n,a,x) заливка x с числом раз, которое число в a делится на каждое простое число, считая степени несколько раз. По сути это компьютеры первичной факторизации продукта a ,
g(v,w) занимает список номеров v и главная факторизация w и делит любой элемент в v с общим множителем в w, пока они не имеют общих множителей. (Разделение простой факторизации означает вычитание власти на 1).
Итак, теперь у нас есть main , Сначала он инициализирует P массив и читает в данных длины (странно, что никогда не кажется, что для чтения в самих данных). Затем он хранит простые факторизации произведений элементов в a и b в x и y соответственно. Затем он использует лямбда-выражение в цикле, чтобы взять поэлементный минимум этих двух факторизаций, давая факторизацию наибольшего общего множителя. Наконец, он разделяет элементы в a и b по этому общему фактору.
6 класс, 9 урок, Сокращение дробей
user1420279 10 сен ’12 в 21:44 2012-09-10 21:44
2012-09-10 21:44
р [я] является высшим простым множителем я
for (int i = x; i > 1; i /= p[i])
будет повторяться один раз для каждого простого множителя x;
Затем он использует это для подсчета основных факторов.
А затем используя их, чтобы разделить как соответствующие числитель / знаменатель терминов.
Источник: stackru.com
Как можно оптимизировать алгоритм сокращения дроби?
Решил сокращать дроби, деля их на простые числа от 2 до минимального значения между числителем и знаменателем (т.е. если числитель больше знаменателя, то берём все простые числа от 2 до знаменателя, и наоборот).
Нахождение простых чисел реализовал через «Решето Эратосфена». Все найденные простые числа остаются в массиве simpleNumbers, в целях оптимизации, т.к. функция сокращения дроби используется многократно.
var simpleNumbers = [2, 3]; function getSimpleNumbers(limit) < var i = (simpleNumbers.length == 0) ? 0 : simpleNumbers[ simpleNumbers.length — 1 ]; if( i >limit ) < for (var k = 0; ; k++) < if( simpleNumbers[k] >limit ) < return simpleNumbers.slice(0, k); break; >> > for (; i > if( flag ) < simpleNumbers.push(i); >> return simpleNumbers; > // Функция принимает два аргумента и максимально сокращает их. // Функция возвращает объект с двумя свойствами n и d (числитель и знаменатель) function reduceFrac(numerator, denomerator) < var frac = < n: numerator, d: denomerator >, s; if(Math.abs(frac.n) > Math.abs(frac.d)) < s = getSimpleNumbers( Math.abs(frac.d) ); >else < s = getSimpleNumbers( Math.abs(frac.n) ); >for (var i = 0; i < s.length; i++) < while(true) < if( Math.abs(frac.n % s[i]) == 0 Math.abs(frac.d % s[i]) == 0 ) < frac.n /= s[i]; frac.d /= s[i]; >else < break; >> > return frac; >
- Вопрос задан более трёх лет назад
- 1328 просмотров
Источник: qna.habr.com
Основное свойство дроби. Сокращение дробей. 5 класс.
Программа алгоритм сокращение дробей
Находишь наибольшее общее кратное(НОД) делителя и знаменателя.
Есть такой алгоритм, алгоритм Евклида называется.
function gcd(a, b): while b <> 0 do begin t := b; b := a mod b; a := t; end; Result:= a;
Далее делишь числитель и знаменатель на НОД.
R.P:=R.P div GCD_Result; R.Q:=R.Q div GCD_Result;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,816
Вот интересно, есть ли модули сокращения дроби?
Есть ли такой модуль/исходник, который будет сокращать дроби типа: 2/3*3.
Я создал программу для подсчета, но она считает с небольшой ошибкой, так как она сначала делит 2/3=0,666(6)и потом умножает на 3, ну в общем суть понятно думаю.
И конечный результат отличается от правильно примерно на 3780-3720=60.
Покажи что ты создал. И мы ответим в чём ты не прав.
P.S. Хотя на 90% я и так знаю в чём проблема. В неверном выборе типа вещественных переменных.
Пользователь
Регистрация: 12.09.2012
Сообщений: 15
Покажи что ты создал. И мы ответим в чём ты не прав.
P.S. Хотя на 90% я и так знаю в чём проблема. В неверном выборе типа вещественных переменных.
Последний раз редактировалось DarkPower; 25.09.2015 в 12:10 .
Регистрация: 04.02.2009
Сообщений: 18,136
где в такой записи сокращаемая дробь? |
Наверно 2/3 и 3/1 умножаются
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Пользователь
Регистрация: 12.09.2012
Сообщений: 15
m:=m-Ail*Akj/n; double
это без дроби.
Для дроби я могу сделать как стринг. И разделить например «/», отправлять стринг в процедуру, которая возвращает тип и с 2-ух целых чисел (числитель/знаменатель).
m:=m-Ail*Akj/n; то есть тут может быть соответственно:
(2/3)-(1/3)*(4/1)/(3/8)
Участник клуба
Регистрация: 15.07.2013
Сообщений: 1,816
А почему double, а не Extended?
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Буквенные сокращения больших чисел. | mrtoxas | Общие вопросы Delphi | 13 | 29.07.2015 10:37 |
Составить программу для сокращения дроби M / N, где M, N-натуральные числа. | kirito_17 | Помощь студентам | 4 | 20.11.2013 18:11 |
библиотечные модули пользователя,модули CRT и DOS | лерка:) | Паскаль, Turbo Pascal, PascalABC.NET | 08.01.2012 14:57 | |
Перебор и его сокращения | *Zimnij* | Общие вопросы C/C++ | 1 | 04.01.2009 14:38 |
Источник: www.programmersforum.ru