User Rating: 0 / 5

Star InactiveStar InactiveStar InactiveStar InactiveStar Inactive
 

Multiples of 3 and 5

Problem 1

Published on Friday, 5th October 2001, 06:00 pm; Solved by 418814

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

по русски:

Если выписать все натуральные числа меньше 10, кратные 3 или 5, то получим 3, 5, 6 и 9. Сумма этих чисел - 23.

Найдите сумму всех чисел меньше 1000, кратных 3 или 5.

 

Проект Эйлера на 1С

На всеми нами любимом инфостарте давно муссируется тема, мол как сделать так, чтобы трукодеры считали нас за людей. Собственно проблема состоит в том, что 1Сников не считают программистами. Тому есть две причины:

1. Порог вхождения в клан 1С-ников - низок. Точнее его нет, чтобы стать 1С-ником, не надо иметь соответствующего образования, уметь программировать. Достаточно пойти к клиенту и установить ему 1С, остальное с опытом придет. Все 1С-ники, даже с образованием, прошли этот путь новичка. Но хочу отметить, что эти люди 1С-ники, но не 1С-программисты. Но слова похожие и эти "новички" портят нам репутацию.

2. Мало кто из трукодеров представляет чем реально занимаются 1С-программисты. Проблема в том, что 1С-программист - на самом деле понятие более широкое, чем просто кодер. Как  правило 1С-программист не только кодер, но еще и: "архитектор БД", "бизнес аналитик", "менеджер проекта", "системный администратор"... . Трукодерам это непонятно, в других средах эти обязанности никогда не выполняются одним человеком, а нам еще и надо хорошо знать прикладную составляющую, а не только техническую сторону.

Так вот, в одной из веток форума, чувак с ником scientes напомнил всем о существовании проекта Эйлер, и предложил решать задачи на платформе 1С, типа какая разница C++ или 1С, ну ниже производительность, но язык-то полноценный. Плюс задачи проекта подразумевают, что правильный код выполнится менее чем за 1 минуту.

Мне как программисту эта идея понравилась. Буду периодически решать попорядку задачки и выкладывать их решения в виде внешних обработок и кода.


Собственно первая мысль, решить в лоб перебором:



Процедура РешитьЗадачу(Команда)
рез = 0;
Для ж = 1 По 999 Цикл
Если ж%3 = 0 Тогда
рез = рез + ж;
ИначеЕсли ж%5 = 0 Тогда
рез = рез + ж;
КонецЕсли;
КонецЦикла;
ответ = рез;
КонецПроцедуры

цикл до 999 потому, что меньше 1000
"%" - остаток от деления, если кто не вспомнил сходу

Но такой подход - слишком простой, для дальнейших задач перебор в лоб будет означать нереальное время выполнения, поэтому подумаем:

посути нам надо получить сумму чисел от 1 до 999 кратную трем, пяти и вычесть кратные 15ти, т.к. они задвоятся. Всего чисел кратных 3ем = 999/3 = 333. Т.е. надо сложить числа от 1 до 333 и умножить на 3. Аналогично для 5и и 15.

Замечу, что сумма от 1 до n = (n+1)/2 * n. Потом мы её умножаем на 3, 5, 15, но n*3 = 999, поэтому сократим это умножение.

Еще для 5и берем не 999, а 995, для 15 - 990.

рез = 0;
рез = рез + ((999/3+1)/2) * 999;
рез = рез + ((995/5+1)/2) * 995;
рез = рез - (990/15+1)/2 * 990;
ответ = рез;

Скрин с проекта с моей публикацией:)

Во вложениях обработка

 

 

 

Вложения
Download this file (ЗадачаЭйлера0001.epf)ЗадачаЭйлера0001.epf[ ]6 kB

Авторизуйтесь пожалуйста