Найти числа

1. scientes 293 24.11.22 18:34 Сейчас в теме
Задача найти шестизначные числа, которые не делятся на 10 и делятся на число, в котором цифры исходного числа записаны в обратном порядке. То есть, abcdef делится на fedcba, при этом abcdef<>fedcba . Как это быстро сделать на 1С ?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1863362 24.11.22 19:14 Сейчас в теме
(1)
быстро
1Сники традиционно делают это брутфорсом
3. user1826630 24.11.22 19:34 Сейчас в теме
(1) Вопрос - нафига?
А правильный ответ - ну, например, точно так же, как в SQL.
4. user1863362 24.11.22 19:47 Сейчас в теме
(3)
А правильный ответ
Неправильно. Еще быстрее спросить на форуме
5. user1863362 24.11.22 19:47 Сейчас в теме
6. user1826630 24.11.22 20:05 Сейчас в теме
7. user1863362 24.11.22 20:17 Сейчас в теме
8. user856012 14 24.11.22 21:17 Сейчас в теме
(7)
Тебе на семерку
Лехко! Воть: 777777

И на все остальные цифры (кроме ноля) тоже: 111111, 222222, 333333, 444444, 555555, 666666, 888888, 999999

P.S. Условие неповторяемости цифр в исходной задаче есть? Нету! Фсё, претензии не принимаются!
Lemmonbri; +1 Ответить
9. user1863362 24.11.22 21:23 Сейчас в теме
(8)
в исходной задаче есть? Нету! Фсё, претензии не принимаются!
Ух, а скажи еще что нибудь на франчайзевском!
10. user856012 14 24.11.22 21:52 Сейчас в теме
(9)
еще что нибудь на франчайзевском!
Пжалста, классика: "Оплатили? Получили? Следующий!"
12. user1826630 24.11.22 22:27 Сейчас в теме
(10) Мой шеф говорил:
Правила освоения бюджета следующие - получил тарелку, съел, облизал, показал - и сразу проси добавки!
11. user1826630 24.11.22 22:26 Сейчас в теме
(9)
Ух, а скажи еще что нибудь на франчайзевском!
Нууу... Нет условия, что результатом деления должно являться целое число... ))
Что бы еще такого сказать...
13. scientes 293 24.11.22 23:47 Сейчас в теме
(8) По условию
То есть, abcdef делится на fedcba, при этом abcdef<>fedcba
14. scientes 293 24.11.22 23:52 Сейчас в теме
Это первая версия программы, которая ищет решения 43 секунды. Вторая находит решения за 5 сек.
Function bin(n,p=2) export
	arr=new array;
	r=n;
	while r<>0 do
		d=r%p;
		arr.Add(d);
		r=(r-d)/p
	enddo;
	return arr;
endfunction	

function reverse10(знач n) export
	s=0;
	for each d in bin(n,10) do
	   s=s*10+d
    enddo;
   
    return s;
endfunction	

function WhatNumber() export
	
	for i=100008 to 999999 do
		j=reverse10(i);
		if i%10<>0 and  i>j and i%j=0 then
			message(""+i+"/"+j+"="+i/j);
		endif;	
		i=i+8;
	enddo;	
	
endfunction	
Показать
16. user1863362 25.11.22 00:15 Сейчас в теме
(14)

for i=100008 to 999999 do
...
i=i+8;
enddo;

А, ты вообще из этих...
17. user1863362 25.11.22 00:45 Сейчас в теме
(14) Если не приходя в сознание, то прямо по твоему коду:
Процедура НайтиЧисла()

	ТекущееЧисло = 100008;
	Пока ТекущееЧисло <= 999999 Цикл
		
		Если ТекущееЧисло % 10 <> 0 Тогда
			Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки(XMLСтрока(ТекущееЧисло));
			ОбратноеЧисло = Число(ПолучитьСтрокуИзБуфераДвоичныхДанных(Буфер.Перевернуть()));

			Если ТекущееЧисло <> ОбратноеЧисло И ТекущееЧисло % ОбратноеЧисло = 0 Тогда
				Сообщить("" + ТекущееЧисло + "/" + ОбратноеЧисло + "=" + ТекущееЧисло / ОбратноеЧисло);
			КонецЕсли;
		КонецЕсли;
		
		ТекущееЧисло = ТекущееЧисло + 9;
	КонецЦикла;
	
КонецПроцедуры
Показать


1,2 секунды.

Может не стоит тебе на английском писать? Оно, видимо, тормозов добавляет.
kuzev; scientes; Lemmonbri; +3 Ответить
19. scientes 293 25.11.22 09:21 Сейчас в теме
(17)

Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки(XMLСтрока(ТекущееЧисло));
ОбратноеЧисло = Число(ПолучитьСтрокуИзБуфераДвоичныхДанных(Буфер.Перевернуть()));

Про такой вариант получения обратного числа не знал. Работает быстро. Спасибо.
15. user1863362 25.11.22 00:09 Сейчас в теме
(14)
за 5 сек.

Позорник.
3 секунды на файловой базе.
ВЫБРАТЬ 0 КАК Разряд ПОМЕСТИТЬ Разряды
ОБЪЕДИНИТЬ ВЫБРАТЬ 1
ОБЪЕДИНИТЬ ВЫБРАТЬ 2
ОБЪЕДИНИТЬ ВЫБРАТЬ 3
ОБЪЕДИНИТЬ ВЫБРАТЬ 4
ОБЪЕДИНИТЬ ВЫБРАТЬ 5
ОБЪЕДИНИТЬ ВЫБРАТЬ 6
ОБЪЕДИНИТЬ ВЫБРАТЬ 7
ОБЪЕДИНИТЬ ВЫБРАТЬ 8
ОБЪЕДИНИТЬ ВЫБРАТЬ 9
;
ВЫБРАТЬ 
	ТекущееЧисло
ИЗ	
(
	ВЫБРАТЬ 
		  1 * Разряд1.Разряд
		+ 10 * Разряд2.Разряд
		+ 100 * Разряд3.Разряд
		+ 1000 * Разряд4.Разряд
		+ 10000 * Разряд5.Разряд
		+ 100000 * Разряд6.Разряд
		КАК ТекущееЧисло,

		  1 * Разряд6.Разряд
		+ 10 * Разряд5.Разряд
		+ 100 * Разряд4.Разряд
		+ 1000 * Разряд3.Разряд
		+ 10000 * Разряд2.Разряд
		+ 100000 * Разряд1.Разряд
		КАК ОбратноеЧисло
		
	ИЗ	
		Разряды КАК Разряд1,
		Разряды КАК Разряд2,
		Разряды КАК Разряд3,
		Разряды КАК Разряд4,
		Разряды КАК Разряд5,
		Разряды КАК Разряд6
) КАК ВсеЧисла	
ГДЕ
	ТекущееЧисло > 100000
	И ТекущееЧисло - 10 * ВЫРАЗИТЬ(ТекущееЧисло / 10 - 0.5 КАК ЧИСЛО(6, 0)) <> 0
	И ТекущееЧисло - ОбратноеЧисло * ВЫРАЗИТЬ(ТекущееЧисло / ОбратноеЧисло - 0.5 КАК ЧИСЛО(6, 0)) = 0
	И ТекущееЧисло <> ОбратноеЧисло
Показать
scientes; rintik; Lemmonbri; +3 Ответить
18. scientes 293 25.11.22 08:59 Сейчас в теме
(15) Запрос это хорошо. Коллективный разум обогащает. Добавил бы сюда делимость на 9 и условие на последний разряд, что он ненулевой.
Это второй вариант мое кода.
Функция ОбратныеПары()
	
	словарь=новый Соответствие;
	
	для i=0 по 9 цикл
		для j=0 по 9 цикл
			словарь.Вставить(i*10+j,j*10+i);
		конеццикла;
	конеццикла;	
	
   возврат словарь;
КонецФункции	

Функция КакоеЧисло()  export
	
	//-------------------------
	//    abcdef
	//   *     k
	//   -------
	//    fedcba
	
	обратное=ОбратныеПары();
	
	для cd=0 по 99 цикл
		cd100=cd*100;
		для ef=1 по 99 цикл
			если ef%10=0 тогда //число не делится на 10
				продолжить;
			конецесли;
			cdef=(cd100+ef);
			//число cdef последовательно умножаем на 2..9
			для k=2 по 9 цикл
				T=cdef*k     ;//произведение
				ba=T%100     ;//правые разряды полученного произведения
				если ba%10=0 тогда
					продолжить;	
				конецесли;
				dc=((T-ba)/100)%100;//левые разряды полученного произведения
				если dc=обратное[cd] тогда //проверяем, что dc и cd обратные
					i=обратное[ba]*10000+cdef; //формируем исходное число
					если i%9=0 тогда   //проверяем на делимость на 9
						j=100*(обратное[ef]*100+dc)+ba; // формируем обратное число
					    если (i*k)=j тогда
							сообщить(""+i+"*"+k+"="+j);
						конецесли;;	
					конецесли;
				конецесли;
			конеццикла;	
		конеццикла;
	конеццикла;	
	
	
КонецФункции
Показать
22. starik-2005 3080 25.11.22 11:04 Сейчас в теме
(18)
если ef%10=0 тогда //число не делится на 10
продолжить;
конецесли
А не проще к ef сразу 10 добавлять с while, а не for юзать?
Ну и 100000 делится на 000001 и на 10. И зачем выше циклы начинали с 100008? Столько вопросов! )))
23. scientes 293 25.11.22 11:10 Сейчас в теме
(22) abcdef=k*fedcba, где к=2...9

abcdef-fedcba=(k-1)*fedcba

Когда мы вычитаем числа , в которых сумма цифр одинаковая, то получается число, которое делится на 9. Так как (к-1) на 9 не делится, значит на 9 делится fedcba и соответственно abcdef. Поэтому перебираем только числа, которые делятся на 9.
24. starik-2005 3080 25.11.22 11:14 Сейчас в теме
(23) но в любом случае 100008 не делится на 10.
25. scientes 293 25.11.22 11:22 Сейчас в теме
(24) В исходном и обратном числе количество цифр одинаковое, поэтому ни одно из них не делится на 10. Числа кратные 10 отбрасываем.
26. starik-2005 3080 25.11.22 11:23 Сейчас в теме
(25)
на 10
А! Невнимательно прочитал и не заметил "не делятся на 10".
28. scientes 293 04.09.24 23:21 Сейчас в теме
(23) Здесь я ошибаюсь. Такие рассуждения справедливы для простого числа. А 9=3*3
20. scientes 293 25.11.22 10:27 Сейчас в теме
Немного доработал запрос.
запрос.Текст="ВЫБРАТЬ
	             |	0 КАК Разряд
	             |ПОМЕСТИТЬ Разряды
	             |
	             |ОБЪЕДИНИТЬ
	             |
	             |ВЫБРАТЬ
	             |	1
	             |
	             |ОБЪЕДИНИТЬ
	             |
	             |ВЫБРАТЬ
	             |	2
	             |
	             |ОБЪЕДИНИТЬ
	             |
	             |ВЫБРАТЬ
	             |	3
	             |
	             |ОБЪЕДИНИТЬ
	             |
	             |ВЫБРАТЬ
	             |	4
	             |
	             |ОБЪЕДИНИТЬ
	             |
	             |ВЫБРАТЬ
	             |	5
	             |
	             |ОБЪЕДИНИТЬ
	             |
	             |ВЫБРАТЬ
	             |	6
	             |
	             |ОБЪЕДИНИТЬ
	             |
	             |ВЫБРАТЬ
	             |	7
	             |
	             |ОБЪЕДИНИТЬ
	             |
	             |ВЫБРАТЬ
	             |	8
	             |
	             |ОБЪЕДИНИТЬ
	             |
	             |ВЫБРАТЬ
	             |	9
	             |;
	             |
	             |////////////////////////////////////////////////////////////­////////////////////
	             |ВЫБРАТЬ
	             |	ВсеЧисла.ТекущееЧисло КАК ТекущееЧисло
	             |ИЗ
	             |	(ВЫБРАТЬ
	             |		Разряд1.Разряд + 10 * (Разряд2.Разряд + 10 * (Разряд3.Разряд + 10 * (Разряд4.Разряд + 10 * (Разряд5.Разряд + 10 * Разряд6.Разряд)))) КАК ТекущееЧисло,
	             |		Разряд6.Разряд + 10 * (Разряд5.Разряд + 10 * (Разряд4.Разряд + 10 * (Разряд3.Разряд + 10 * (Разряд2.Разряд + 10 * Разряд1.Разряд)))) КАК ОбратноеЧисло
	             |	ИЗ
	             |		Разряды КАК Разряд1,
	             |		Разряды КАК Разряд2,
	             |		Разряды КАК Разряд3,
	             |		Разряды КАК Разряд4,
	             |		Разряды КАК Разряд5,
	             |		Разряды КАК Разряд6
	             |	ГДЕ
	             |		Разряд1.Разряд + Разряд2.Разряд + Разряд3.Разряд + Разряд4.Разряд + Разряд5.Разряд + Разряд6.Разряд В (9, 18, 27, 36, 45, 54)
	             |		И Разряд1.Разряд <> 0) КАК ВсеЧисла
	             |ГДЕ
	             |	ВсеЧисла.ТекущееЧисло > 100000
	             |	И ВсеЧисла.ТекущееЧисло <> ВсеЧисла.ОбратноеЧисло
	             |	И ВсеЧисла.ТекущееЧисло >= 2 * ВсеЧисла.ОбратноеЧисло
	             |	И ВсеЧисла.ТекущееЧисло <= 9 * ВсеЧисла.ОбратноеЧисло
	             |	И ВсеЧисла.ТекущееЧисло = ВсеЧисла.ОбратноеЧисло * (ВЫРАЗИТЬ(ВсеЧисла.ТекущееЧисло / ВсеЧисла.ОбратноеЧисло КАК ЧИСЛО(1, 0)))";
				 



Показать
21. scientes 293 25.11.22 10:54 Сейчас в теме
Похоже, что все подобные числа имеют вид ИскомоеЧисло=(4 или 9)*ОбратноеЧисло.
27. scientes 293 04.09.24 18:56 Сейчас в теме
Спустя два года вернулся к этой задаче. Нашел быстрый переборный алгоритм. Для 9-значных чисел ответ находится за 0.6 сек.

217802178*4=871208712
217812178*4=871248712
217822178*4=871288712
219781978*4=879127912
219791978*4=879167912
219979978*4=879919912
219989978*4=879959912
219999978*4=879999912
108901089*9=980109801
108911089*9=980199801
109890989*9=989018901
109989989*9=989909901
109999989*9=989999901
29. scientes 293 06.09.24 09:34 Сейчас в теме
(27) По-видимому в основе всех чисел лежат два базовые числа - 2178 и 1098
Оставьте свое сообщение

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