Алгоритм нахождения наименьшего общего делителя чисел в 1С

1. mark_oilbass 20.01.19 18:54 Сейчас в теме
Здравствуйте!

Необходимо написать алгоритм нахождения наименьшего общего делителя чисел в 1с. Например НОД(168, 180, 3024). Может кто то уже делал или может дать наводку, вообщем за любую помощь буду очень благодарен!
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 20.01.19 19:20 Сейчас в теме
(1)
Необходимо написать алгоритм нахождения наименьшего общего делителя чисел в 1с

Если именно наименьший, то тривиально: ответ всегда будет 1.

Для наибольшего есть много алгоритмов, пусть не на 1С, но переделать не будет проблемой. Только обычно алгоритмы для 2 чисел.
3. spacecraft 20.01.19 19:57 Сейчас в теме +0.79 $m
(1) вот один из вариантов НОД3() для 3-х положительных чисел:
Функция НОД(а,б)
	Пока а <> б Цикл
		Если а > б Тогда а = а - б;
		Иначе б = б - а; 
		КонецЕсли;
	КонецЦикла;
	Возврат а;
КонецФункции

Функция НОД3(Знач а, Знач б, Знач в)
	Возврат НОД(НОД(а,б),в);
КонецФункции
Показать
mark_oilbass; +1 Ответить
5. mark_oilbass 21.01.19 08:28 Сейчас в теме
(3)спасибо большое, буду пробовать)
14. buganov 200 21.01.19 17:59 Сейчас в теме
(5) Тестируйте тщательнее. Его код нерабочий
11. buganov 200 21.01.19 13:18 Сейчас в теме
(3) Сколько итераций потребуется для НОД(2100, 3333)?
4. kumi2012 103 20.01.19 19:58 Сейчас в теме
Циклом от наименьшего из чисел сравнивая результат деления на отсутствиен дробной части.
buganov; mark_oilbass; +2 Ответить
6. buganov 200 21.01.19 10:03 Сейчас в теме
Функция НОД(А, Б)
Для Сч = 2 По 9 Цикл
Если А % 2 = 0 И Б % 0 = 0 Тогда
Возврат Сч;
КонецЦикла;
КонецФункции

НОД(6, 4) = 2;
7. spacecraft 21.01.19 10:08 Сейчас в теме
(6)
Если А % 2 = 0 И Б % 0 = 0 Тогда

И чему равен остаток от деления на 0?
10. buganov 200 21.01.19 13:15 Сейчас в теме
(7) опечатка. Очевидно же, не?
12. spacecraft 21.01.19 14:34 Сейчас в теме
(10) только если весь код назвать "опечатка".
13. buganov 200 21.01.19 17:57 Сейчас в теме
(12) Олежа, просто протестируй. Твой код врет да еще и цикл делает кучу лишних манипуляций. И тот факт, что писал я только пример, поправив который все посчитает не делает его "опечаткой".
В итоге:
Твой код показал результат 9 и 62 итерации цикла
Мой код показал 3 и 2 итерации.
Пояснишь?

	К1 = 0; К2 = 0;
	НодОлежи(9999, 4500, К1);
	Нод(9999, 4500, К2);
	
	Сообщить(К1);
	Сообщить(К2);
	
КонецПроцедуры

Функция НодОлежи(а, б, К)
	Пока а <> б Цикл
		К = К + 1;
		Если а > б Тогда а = а - б;
		Иначе б = б - а; 
		КонецЕсли;
	КонецЦикла;
	Возврат а;	
КонецФункции

Функция НОД(Ч1, Ч2, К)
	Для Сч = 2 По 999 Цикл 
		К = К + 1;
		Если Ч1 % Сч = 0 И Ч2 % Сч = 0 Тогда 
			Возврат Сч;
		КонецЕсли;
	КонецЦикла; 
КонецФункции 
Показать
15. spacecraft 21.01.19 18:10 Сейчас в теме
(13)
Твой код показал результат 9 и 62 итерации цикла
Мой код показал 3 и 2 итерации.
Пояснишь?

Что пояснять? Что ваш код сплошная "опечатка"? И это с условием не одного изменения...
9999/9 = 1111, 4500/9 = 500. Итого: 9 наибольший общий делитель.
Еще вопросы?
16. buganov 200 22.01.19 04:50 Сейчас в теме
(15) 9999 / 3 = 3333; 4500 / 3 = 1500. Итого НАИМЕНЬШИЙ общий делитель = 3.
Вопросы?
Здравствуйте!

Необходимо написать алгоритм нахождения наименьшего общего делителя чисел в 1с.


Правок не так уж и много, к тому же я лишь хотел задать вектор
17. spacecraft 22.01.19 08:54 Сейчас в теме
(16) Для начала: прочтите наконец (2) и поищите информацию про НОД, чтобы хотя бы понимать тему, прежде чем что-то пытаться доказать.
18. buganov 200 22.01.19 09:09 Сейчас в теме
(17)
Для начала: прочтите наконец (2)

для начала стоит читать (0). Есть задача, есть решение. В (2) да, решение = 1. Это ответ на поставленный вопрос. Если нужен ответ на наименьший не равный 1, то мой вариант. Про наибольший есть эффективные алгоритмы и запрограммировать их не составит труда. Топикстартер задал вопрос по НАИМЕНЬШЕМУ точка. Наименьшее равное единице не имеет смысла, потому что всегда истинно.
19. spacecraft 22.01.19 09:17 Сейчас в теме
(18)
Это ответ на поставленный вопрос. Если нужен ответ на наименьший не равный 1, то мой вариант. Про наибольший есть эффективные алгоритмы и запрограммировать их не составит труда. Топикстартер задал вопрос по НАИМЕНЬШЕМУ точка.


это попытка подогнать свой ответ под вопрос? Где в вопросе про "наименьший" и не равен 1? Сами придумали?
НОД, 6 класс, математика. Нет понятия наименьший общий делитель, так как он всегда равен 1. В этом случае логично предположить, что автор темы просто опечатался в наименовании.
Учитывая, что приводится в вопросе: "Например НОД(168, 180, 3024)". А НОД() это конкретно расшифровывается в математике как Наибольший общий делитель.

В любом случае ваш ответ вообще ни подо что не подходит.
21. buganov 200 22.01.19 09:23 Сейчас в теме
(19) ты прочитай тему и поймешь, что ТС ни в шапке, ни в комментарии не указал, что ему действительно нужен наибольший. Но русским по белому написал наименьший. Для чего ему это понадобилось это его дело. Да, я подогнал свой ответ под вопрос. Потому что иначе ответ = 1 не имеет смысла, т.к. всегда в истине.
А НОД() это конкретно расшифровывается в математике как

Нод — многозначный термин

Земля Нод — упоминаемая в Библии местность, куда был изгнан Каин после убийства Авеля.
НОД — на железнодорожном транспорте — начальник отделения железной дороги .
НОД — Народное ополчение Донбасса
НОД — российское политическое движение, созданное в 2012 году. Выступает в поддержку президента РФ Владимира Путина, активисты отметились рядом провокаций и нападений на оппозиционных активистов.
Братство Нод — организация из серии игр Command & Conquer , возглавляемая Кейном.
23. spacecraft 22.01.19 09:25 Сейчас в теме
(21)
Нод — многозначный термин

что конкретно не понятно в фразе: "НОД() это конкретно расшифровывается в математике"?
20. spacecraft 22.01.19 09:22 Сейчас в теме
(18)
Наименьшее равное единице не имеет смысла, потому что всегда истинно.

Тогда попробуйте свой код : НОД(3,4)
22. buganov 200 22.01.19 09:24 Сейчас в теме
(20) задача требует исключения. В конце возврат 1. Все
25. spacecraft 22.01.19 09:29 Сейчас в теме
(22) я смотрю вы ничего не слышите и не хотите слышать.
И по поводу итераций.
Попробуйте свой код: НОД(991, 997)
24. buganov 200 22.01.19 09:28 Сейчас в теме
(20) и еще раз. Для особо преособо умеющих читать одно, понимать другое. ТС написал НАИМЕНЬШИЙ и нигде не опроверг. Даже после (2). Вот сразу вспоминаются пользователю-любители додумать, после которых приходится устанавливать жесткие рамки. Пусть тебе ботинки раз продадут не по размеру, а как продавец додумал, на размер меньше, тогда все поймешь. А на этом бесконечный цикл предлагаю закончить. Вызови в своей голове Прервать;
26. herfis 499 22.01.19 10:45 Сейчас в теме
(24) Если вы считаете поиск наибольшего общего делителя фантазиями комментаторов, то отбрасывание единицы в качестве наименьшего общего делителя - это уже ваши личные фантазии. ТС ничего такого не говорил и единица отлично подходит.
27. buganov 200 22.01.19 10:56 Сейчас в теме
(26) А если без если? Прочитайте шапку и заголовок. Прочитайте еще раз. И еще раз. А потом вникните, что значит наименьшего.
Я не спорил, что единица неверный вариант, повторять не стал, потому, что смысла повторять (2) нет. Предложил свой вариант, когда наименьший не единица.

И еще раз повторюсь специально для вас(не Вас, а всех абстрактных комментаторов). Я не говорил, что единица неправильный. Я не говорил, что мой вариант единственно верный. Я лишь предложил свой вариант для случая, когда единица, которая является истиной для любых вариантов нахождения НАИМЕНЬШЕГО общего делителя.
И еще раз. Для случая, когда единица, которая является истиной для любых вариантов нахождения НАИМЕНЬШЕГО общего делителя, но без единицы.
Почему без единицы? Повторюсь. Потому что вопрос не имеет смысла в таком случае.
28. herfis 499 22.01.19 11:07 Сейчас в теме
(27)
Почему без единицы? Повторюсь. Потому что вопрос не имеет смысла в таком случае.

И еще потому, что термин НОД имеет вполне однозначное толкование в обсуждаемом контексте. ТС с очень большой вероятностью ошибся.
Ваша позиция хоть и странная, но понятная. Я бы и слова не сказал, если бы не ваша агрессивная манера отстаивания этой позиции с переходом на личности.
29. buganov 200 22.01.19 11:50 Сейчас в теме
(28)
1. ТС нигде не опроверг, что ему требуется наименьший общий знаменатель.
2. Я согласен, что термин НОД является наибольшим, математику не прогуливал. Но заголовок, описание. И к тому же, ТС не сказал, что ему нужен наибольший, он предложил имя функции.
3. да, возможно, я слишком близко принял выпады Олега. Но напомню с чего все началось
(10) только если весь код назвать "опечатка".


Особенно, если учесть, что сам он в контексту вопроса, не прав.

И Вы лично, судя по разработкам, являетесь разработчиком и должны понимать контекст задачи, что есть конкретная данность, которую нужно принять. Возможно уточнить, немного модифицировать, но не так, чтобы при запросе количества выдавалась сумма.

Если бы ТС пришел в свою тему и сказал, что он опечатался, я бы в таком случае согласился.
30. spacecraft 22.01.19 12:22 Сейчас в теме
(29) вам просто страшно признать свои ошибки. Вместо этого придумали только вам понятный новый алгоритм "наименьший" вопреки простейшей математики.
32. buganov 200 22.01.19 12:37 Сейчас в теме
31. herfis 499 22.01.19 12:34 Сейчас в теме
(29) Ок. Расходимся :)
Если дождемся ТС, пускай выбирает, что ему на самом деле нужно было.
8. herfis 499 21.01.19 10:11 Сейчас в теме
По-моему, с алгоритма Евклида для нахождения НОД чуть ли не каждая вторая книжка имеющая отношение к программированию начинается :)
35. papami 55 22.01.19 22:01 Сейчас в теме
(8) Это в учебнике по математике за 5 класс есть.
9. gkhvgkh 21.01.19 12:15 Сейчас в теме
Помню в студенческие годы писал такую процедуру на паскале.
Все довольно просто, но алгоритм далеко не самый эффективный.

var
i, a, b: integer
c: longint;

c := max(a,b);

for i := 1 to c do
begin
if (i mod a = 0) and (i mod b = 0) then writeln(inttostr(i), ' - минимальный общий делитель');
end;


end;
33. meriferi 22.01.19 14:14 Сейчас в теме
(9) int nok(int a, int b)
{
int max = b;
for(int i = max; i > 0; i++){

if((i % a == 0) && (i % b == 0)){
return i;
}
}
}
34. senshkr 13 22.01.19 21:14 Сейчас в теме
1. Ищем наименьшее из чисел
2. Строим цикл от 1 до этого наименьшего
3.Делим исследуемые числа на итератор цикла
4. Сравниваем полученные результаты с их округленными(до целого) значениями
5. Если все сравниваемые величины совпали совпали, то НОД = итератор цикла
36. user1135946 24.01.19 09:36 Сейчас в теме
(34)
1. Ищем наименьшее из чисел
2. Строим цикл от 1 до этого наименьшего
3.Делим исследуемые числа на итератор цикла
4. Сравниваем полученные результаты с их округленными(до целого) значениями
5. Если все сравниваемые величины совпали совпали, то НОД = итератор цикла

:)
37. scientes 289 24.01.19 15:01 Сейчас в теме
Идея алгоритма поиска НОД очень проста. Пусть а>б. Тогда НОД(а,б)=НОД(б,а-б)
38. timeforlive 15 25.01.19 06:16 Сейчас в теме
Все что нужно, мне дает гугл.
Формулы Раз:
https://www.zaochnik.com/spravochnik/matematika/delimost/nahozhdenie-naimenshego-obschego-kratnogo/

Формулы Два:
http://algebrra.com/nod-nok/15-17

Понравился подход через поиск общего множителя. То есть, здесь без цикла выполняется поиск необходимого результата - благодаря формулам. Советую посмотреть материалы по ссылкам.
39. scientes 289 25.01.19 11:13 Сейчас в теме
Максимальный общий делитель , как мне кажется, искать нужно с помощью соотношения

. Пусть а>б. Тогда МОД(а,б)=МОД(б,а%б)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот