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

02.11.24

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Расчет ряда чисел удовлетворяющих условию: сумма двух ненулевых слагаемых составленных из знаков числа возведенного в квадрат равняется самому числу :
.epf 7,50Kb
7
7 Скачать (10 SM) Купить за 4 550 руб.

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

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

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

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

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

 

Проверено на следующих конфигурациях и релизах:

  • 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.10.357

алгоритм

См. также

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

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

1 стартмани

30.01.2024    3162    stopa85    12    

38

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

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

19.10.2023    7550    user1959478    51    

36

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

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3107    maksa2005    8    

26

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

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

1 стартмани

09.06.2023    10902    7    SpaceOfMyHead    18    

61

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

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

03.04.2023    4357    RustIG    9    

25

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

В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.

23.11.2022    3527    gzharkoj    14    

25

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

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

1 стартмани

21.03.2022    9041    7    kalyaka    11    

44
Отзывы
12. scientes 295 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 19 27.12.18 18:21 Сейчас в теме
это медленный алгоритм , думаю счет будет идти на дни
3. herfis 513 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 19 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 295 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 513 29.12.18 14:20 Сейчас в теме
(8) Круто. А куда копать, чтобы понять как оно работает? :)
12. scientes 295 05.01.19 09:03 Сейчас в теме
(9)Я рассуждал следующим образом. Число, которое мы ищем обладает следующим свойством - оно равно сумме двух чисел а и б (Н=(а+б)).Причём (а+б)*(а+б)=10^к*а+б.Вычтем из левой и правой части (а+б), получим
Н*(Н-1)=9...9*а. Таким образом либо искомое число, либо оно без единицы делится на один из простых сомножителей числа, состоящего из одних девяток. Остальное ясно из приведенного кода.
pm74; herfis; +2 Ответить
13. herfis 513 08.01.19 12:21 Сейчас в теме
(12) Круть! Спасибо. Сначала не до конца разобрался, успел успешно забыть основную теорему :) Теперь вроде разобрался.
10. pm74 203 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 19 02.01.19 22:48 Сейчас в теме
Оставьте свое сообщение