Найти числа

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

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

P.S. Условие неповторяемости цифр в исходной задаче есть? Нету! Фсё, претензии не принимаются!
Lemmonbri; +1 Ответить
9. rovodap 24.11.22 21:23 Сейчас в теме
(8)
в исходной задаче есть? Нету! Фсё, претензии не принимаются!
Ух, а скажи еще что нибудь на франчайзевском!
10. user856012 13 24.11.22 21:52 Сейчас в теме
(9)
еще что нибудь на франчайзевском!
Пжалста, классика: "Оплатили? Получили? Следующий!"
12. user1826630 24.11.22 22:27 Сейчас в теме
(10) Мой шеф говорил:
Правила освоения бюджета следующие - получил тарелку, съел, облизал, показал - и сразу проси добавки!
11. user1826630 24.11.22 22:26 Сейчас в теме
(9)
Ух, а скажи еще что нибудь на франчайзевском!
Нууу... Нет условия, что результатом деления должно являться целое число... ))
Что бы еще такого сказать...
13. scientes 281 24.11.22 23:47 Сейчас в теме
(8) По условию
То есть, abcdef делится на fedcba, при этом abcdef<>fedcba
14. scientes 281 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. rovodap 25.11.22 00:15 Сейчас в теме
(14)

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

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

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

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


1,2 секунды.

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

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

Про такой вариант получения обратного числа не знал. Работает быстро. Спасибо.
15. rovodap 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 281 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 2773 25.11.22 11:04 Сейчас в теме
(18)
если ef%10=0 тогда //число не делится на 10
продолжить;
конецесли
А не проще к ef сразу 10 добавлять с while, а не for юзать?
Ну и 100000 делится на 000001 и на 10. И зачем выше циклы начинали с 100008? Столько вопросов! )))
23. scientes 281 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 2773 25.11.22 11:14 Сейчас в теме
(23) но в любом случае 100008 не делится на 10.
25. scientes 281 25.11.22 11:22 Сейчас в теме
(24) В исходном и обратном числе количество цифр одинаковое, поэтому ни одно из них не делится на 10. Числа кратные 10 отбрасываем.
26. starik-2005 2773 25.11.22 11:23 Сейчас в теме
(25)
на 10
А! Невнимательно прочитал и не заметил "не делятся на 10".
20. scientes 281 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 281 25.11.22 10:54 Сейчас в теме
Похоже, что все подобные числа имеют вид ИскомоеЧисло=(4 или 9)*ОбратноеЧисло.
Оставьте свое сообщение
Вакансии
Ведущий разработчик 1С
Новосибирск
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Ведущий Консультант/Аналитик 1С
Москва
зарплата от 150 000 руб. до 250 000 руб.
Полный день

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Программист 1С
Великие Луки
зарплата от 100 000 руб. до 120 000 руб.
Полный день

Программист 1С
Красноярск
зарплата от 160 000 руб. до 180 000 руб.
Полный день