Пример решения математической задачи: вывод ряда чисел где сумма двух ненулевых слагаемых, составленных из знаков числа, возведенного в квадрат, равняется самому числу

27.12.18

Разработка - Математика и алгоритмы

Задача предполагает вывод ряда чисел, удовлетворяющих условию: сумма двух ненулевых слагаемых, составленных из знаков числа, возведенного в квадрат, равняется самому числу (fun only).

Скачать исходный код

Наименование Файл Версия Размер
Расчет ряда чисел удовлетворяющих условию: сумма двух ненулевых слагаемых составленных из знаков числа возведенного в квадрат равняется самому числу :
.epf 7,50Kb
5
.epf 7,50Kb 5 Скачать

Как-то  решал задачку:

Вывести ряд чисел удовлетворяющих условию: сумма двух ненулевых слагаемых  составленных из знаков числа возведенного в квадрат равняется самому числу

Надо было сделать за 30 минут.

fun only (очередная бессмысленная публикация).

&НаСервере
Процедура Команда1НаСервере()
    x = 0;
    Пока x <> 35000 Цикл
        КвадратЧисла = x*x;
        Если КвадратЧисла <> 0 Тогда
            // Получим  квадрат числа в виде нормализованной строки  ( без пробелов и переносов)
            КвадратЧислаТекст =СтрЗаменить(Строка(КвадратЧисла),Символы.НПП,"");
            КвадратЧислаТекст =СтрЗаменить(КвадратЧислаТекст,Символы.ПС,"");
            // получим длину строки и начнем цикл
            // как первое слагаемое мы представим первый символ как второе -все остальные
            // складываем и проверяем на искомый результат
            ДлинаЦикла = СтрДлина(КвадратЧислаТекст);
            ч = 0;
            Пока ч<> ДлинаЦикла  Цикл 
                ПервоеСлагаемое = Сред(КвадратЧислаТекст,0,ч);
                ДлинаПервогоСлагаемого = СтрДлина(ПервоеСлагаемое);
                ВтороеСлагаемое = Прав(КвадратЧислаТекст,ДлинаЦикла-ДлинаПервогоСлагаемого);
                Попытка 
                ЧислоПС=Число(ПервоеСлагаемое);
                ЧислоВС=Число(ВтороеСлагаемое);
                Если  ЧислоПС + ЧислоВС = x 
                и Не(ЧислоПС = 0 Или  ЧислоВС =0)  Тогда 
                ст = Объект.Результат1.Добавить();
                ст.сл1 = ПервоеСлагаемое;
                Ст.сл2 =  ВтороеСлагаемое;
                Ст.число = Строка(x);
                Ст.КвадратЧисла = КвадратЧислаТекст;
            КонецЕсли;
        Исключение
        КонецПопытки;
        ч= ч +1;
    КонецЦикла;
КонецЕсли;
x =x +1;
КонецЦикла;
КонецПроцедуры

 

алгоритм

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1887    stopa85    12    

34

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4690    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7692    4    SpaceOfMyHead    17    

56

Мини-обзор разных решений задач

Математика и алгоритмы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    3118    RustIG    6    

25

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7955    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4568    fishca    13    

37

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8957    John_d    73    

46
Отзывы
12. scientes 288 05.01.19 09:03 Сейчас в теме
(9)Я рассуждал следующим образом. Число, которое мы ищем обладает следующим свойством - оно равно сумме двух чисел а и б (Н=(а+б)).Причём (а+б)*(а+б)=10^к*а+б.Вычтем из левой и правой части (а+б), получим
Н*(Н-1)=9...9*а. Таким образом либо искомое число, либо оно без единицы делится на один из простых сомножителей числа, состоящего из одних девяток. Остальное ясно из приведенного кода.
pm74; herfis; +2
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 27.12.18 18:04 Сейчас в теме
интересно сколько времени будет необходимо для расчета большого ряда, т.е. если

x <> 99999999999999999999999
+
2. alexander-lubich 26 27.12.18 18:21 Сейчас в теме
это медленный алгоритм , думаю счет будет идти на дни
+
3. herfis 498 27.12.18 18:28 Сейчас в теме
Проверка элементарных навыков кодинга. Справился за отведенное время - молодец.
Но фана так себе. Никогда не любил брутфорс.
pm74; +1
4. spacecraft 27.12.18 19:17 Сейчас в теме
что сразу бросается в глаза:
"ДлинаЦикла = СтрДлина(КвадратЧислаТекст);"
Зачем проходить цикл по всей длине квадрата? Ведь ясно же, что если длина больше чем само число, то никогда не будет удовлетворять результату.
Это существенно сократит лишние вычисления.
+
5. spacecraft 27.12.18 20:30 Сейчас в теме
Вот, тоже набросал:
Процедура ВычислитьМагическиеЧисла(Начало, Окончание)
	х=Начало-1;
	Пока х < Окончание Цикл
		х=х+1;
		ДлинаХ = СтрДлина(Формат(х,"ЧГ="));
		КвадратХ = х*х;
		Если КвадратХ <=10 Тогда
			Продолжить;
		КонецЕсли;
		ДлинаКвадратаХ = СтрДлина(Формат(КвадратХ,"ЧГ="));
		Для к=1 По ДлинаХ Цикл
			Если ДлинаКвадратаХ-к > ДлинаХ Тогда
				Продолжить;
			КонецЕсли;
			ПервоеСлагаемое = Число(Лев(Формат(КвадратХ,"ЧГ="),к));
			ВтороеСлагаемое = Число(Прав(Формат(КвадратХ,"ЧГ="),ДлинаКвадратаХ-к));
			Если ВтороеСлагаемое > 0 И х = (ПервоеСлагаемое+ВтороеСлагаемое) Тогда
				Стр = Результат.Добавить();
				Стр.Число = х;
				Стр.ПервоеСлагаемое = ПервоеСлагаемое;
				Стр.ВтороеСлагаемое = ВтороеСлагаемое;
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры
Показать

Для 999 время выполнения = 75 мс.
Для 9 999 = ~780 мс.
Для 99 999 = ~ 8 c.
Для 999 999 = ~ 92 c.

Увеличение времени выполнения близкое к линейному.
Замер времени включает создание и заполнение строк таблицы значений.
+
6. alexander-lubich 26 27.12.18 22:39 Сейчас в теме
(5)
99999 оригинальный = 32с, spacecraft = 12с
9999 оригинальный = 3с, spacecraft = 1с

да в 3 раза быстрее
Прикрепленные файлы:
РядЧиселПоУсловию.epf
+
7. spacecraft 28.12.18 20:49 Сейчас в теме
(5) обнаружил в коде досадную ошибку. Не все числа попадали в выборку.
Переделал без вычисления слагаемых из строки. По скорости приблизительно так же.
Процедура ВычислитьМагическиеЧисла2(Начало, Окончание)
	х = Начало - 1;
	Пока х < Окончание Цикл
		х=х+1;
		КвадратХ = х*х;
		Если КвадратХ <=10 Тогда
			Продолжить;
		КонецЕсли;
		ДлинаХ = СтрДлина(Формат(х,"ЧГ="));
		ДлинаКвадратаХ = СтрДлина(Формат(КвадратХ,"ЧГ="));
		Для к=1 По ДлинаХ Цикл
			Делитель = Pow(10,ДлинаКвадратаХ-к);
			ПервоеСлагаемое = Цел(КвадратХ/Делитель);
			ВтороеСлагаемое = КвадратХ - ПервоеСлагаемое*Делитель;
			Если ВтороеСлагаемое > 0 И х = (ПервоеСлагаемое + ВтороеСлагаемое) Тогда
				Стр = Результат.Добавить();
				Стр.Число = х;
				Стр.ПервоеСлагаемое = ПервоеСлагаемое;
				Стр.ВтороеСлагаемое = ВтороеСлагаемое;
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры
Показать
+
8. scientes 288 29.12.18 12:42 Сейчас в теме
Скорость сумасшедшая.

Функция НайтиРешенияДляКвадратов(вхПредел) экспорт
	
	
	если вхПредел=99 тогда
		Множитель=11;
	иначеесли вхПредел=999 тогда
		Множитель=37;
	иначеесли вхПредел=9999 тогда
		Множитель=101;
	иначеесли вхПредел=99999 тогда
		Множитель=271;
	иначеесли вхПредел=999999 тогда
		Множитель=37;
	иначеесли вхПредел=9999999 тогда
		Множитель=4649;
	иначе
		возврат ложь;
	конецесли;	
	
	
	
	
	K=Множитель;
	ВЛимит=вхПредел*вхПредел;
	пока K<=вхПредел цикл
		//проверка
		A=(K-1)*K;
		если A%вхПредел=0 тогда
			сообщить(строка(K)+" К2->"+строка(K*K)+" Х-> "+строка(A/вхПредел));
		иначе
			A=A+K+K;
			если A%вхПредел=0 тогда
			 М=K+1;	
			 сообщить(строка(М)+" K2->"+строка(М*М)+" Х-> "+строка(A/вхПредел));	
		    конецесли;	
		конецесли;
		K=K+Множитель;
	конеццикла;	
КонецФункции
Показать
herfis; +1
9. herfis 498 29.12.18 14:20 Сейчас в теме
(8) Круто. А куда копать, чтобы понять как оно работает? :)
+
12. scientes 288 05.01.19 09:03 Сейчас в теме
(9)Я рассуждал следующим образом. Число, которое мы ищем обладает следующим свойством - оно равно сумме двух чисел а и б (Н=(а+б)).Причём (а+б)*(а+б)=10^к*а+б.Вычтем из левой и правой части (а+б), получим
Н*(Н-1)=9...9*а. Таким образом либо искомое число, либо оно без единицы делится на один из простых сомножителей числа, состоящего из одних девяток. Остальное ясно из приведенного кода.
pm74; herfis; +2
13. herfis 498 08.01.19 12:21 Сейчас в теме
(12) Круть! Спасибо. Сначала не до конца разобрался, успел успешно забыть основную теорему :) Теперь вроде разобрался.
+
10. pm74 199 29.12.18 20:35 Сейчас в теме
супер быстрый способ , первые 40 чисел

ЧислаКа = "9,45,55,99,297,703,999,2223,2728,4879,4950,5050,5292,7272,7777,9999,17344,22222,38962,77778,82656,95121,99999,142857,148149,181819,187110,208495,318682,329967,351352,356643,390313,461539,466830,499500,500500,533170,538461,609687";
мКа = СтрРазделить(ЧислаКа,",");
Для Ъ = 0 по (мКа.Количество()-1) Цикл
Сообщить(""+(Ъ+1)+". Число - " + мКа[Ъ] + " квадрат - " + мКа[Ъ]*мКа[Ъ]);
КонецЦикла;

(шутка))))

а вобще посмотреть можно здесь

наиболее полный список здесь

забавнее фокус с 6174
alexander-lubich; +1
11. alexander-lubich 26 02.01.19 22:48 Сейчас в теме
pm74 разрушил интригу.
+
Оставьте свое сообщение