По теме из базы знаний
- Задача о числах мудрецов
- Реализация задачки с собеседования: найти максимальное число, но не более, чем ограничено параметром
- Быстрая выгрузка в Excel с оформлением (числа, даты, колонтитулы, гиперссылки) через OpenXML
- Подсистема регулярных выражений с использованием RegEx
- Algo1C: Решение алгоритмических задач на базе 1С:Предприятие [Часть #2]
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Это первая версия программы, которая ищет решения 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
Показать
(14) Если не приходя в сознание, то прямо по твоему коду:
1,2 секунды.
Может не стоит тебе на английском писать? Оно, видимо, тормозов добавляет.
Процедура НайтиЧисла()
ТекущееЧисло = 100008;
Пока ТекущееЧисло <= 999999 Цикл
Если ТекущееЧисло % 10 <> 0 Тогда
Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки(XMLСтрока(ТекущееЧисло));
ОбратноеЧисло = Число(ПолучитьСтрокуИзБуфераДвоичныхДанных(Буфер.Перевернуть()));
Если ТекущееЧисло <> ОбратноеЧисло И ТекущееЧисло % ОбратноеЧисло = 0 Тогда
Сообщить("" + ТекущееЧисло + "/" + ОбратноеЧисло + "=" + ТекущееЧисло / ОбратноеЧисло);
КонецЕсли;
КонецЕсли;
ТекущееЧисло = ТекущееЧисло + 9;
КонецЦикла;
КонецПроцедуры
Показать1,2 секунды.
Может не стоит тебе на английском писать? Оно, видимо, тормозов добавляет.
(14)
Позорник.
3 секунды на файловой базе.
за 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
И ТекущееЧисло <> ОбратноеЧисло
Показать
(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) abcdef=k*fedcba, где к=2...9
abcdef-fedcba=(k-1)*fedcba
Когда мы вычитаем числа , в которых сумма цифр одинаковая, то получается число, которое делится на 9. Так как (к-1) на 9 не делится, значит на 9 делится fedcba и соответственно abcdef. Поэтому перебираем только числа, которые делятся на 9.
abcdef-fedcba=(k-1)*fedcba
Когда мы вычитаем числа , в которых сумма цифр одинаковая, то получается число, которое делится на 9. Так как (к-1) на 9 не делится, значит на 9 делится fedcba и соответственно abcdef. Поэтому перебираем только числа, которые делятся на 9.
Немного доработал запрос.
запрос.Текст="ВЫБРАТЬ
| 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)))";
Показать
Спустя два года вернулся к этой задаче. Нашел быстрый переборный алгоритм. Для 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
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
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот