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

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    1922    stopa85    12    

34

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

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

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

19.10.2023    4772    user1959478    50    

34

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

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

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

1 стартмани

09.06.2023    7793    5    SpaceOfMyHead    17    

56

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

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

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

03.04.2023    3147    RustIG    6    

25

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

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

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

1 стартмани

21.03.2022    7984    7    kalyaka    11    

44

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

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

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

16.12.2021    4597    fishca    13    

37

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

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

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

12.10.2021    9005    John_d    73    

46
Отзывы
12. scientes 289 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 499 27.12.18 18:28 Сейчас в теме
Проверка элементарных навыков кодинга. Справился за отведенное время - молодец.
Но фана так себе. Никогда не любил брутфорс.
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 289 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+Множитель;
	конеццикла;	
КонецФункции
Показать
9. herfis 499 29.12.18 14:20 Сейчас в теме
(8) Круто. А куда копать, чтобы понять как оно работает? :)
12. scientes 289 05.01.19 09:03 Сейчас в теме
(9)Я рассуждал следующим образом. Число, которое мы ищем обладает следующим свойством - оно равно сумме двух чисел а и б (Н=(а+б)).Причём (а+б)*(а+б)=10^к*а+б.Вычтем из левой и правой части (а+б), получим
Н*(Н-1)=9...9*а. Таким образом либо искомое число, либо оно без единицы делится на один из простых сомножителей числа, состоящего из одних девяток. Остальное ясно из приведенного кода.
pm74; herfis; +2 Ответить
13. herfis 499 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 Сейчас в теме
Оставьте свое сообщение