Форум программистов, компьютерный форум, киберфорум
Наши страницы
Тамика
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 1.

Решение задач ProjectEuler №1 и № 2.

Запись от Тамика размещена 16.07.2014 в 12:25
Обновил(-а) Тамика 16.07.2014 в 15:26

Здесь я предлагаю свои варианты решения задач из небезызвестного сайта - http://projecteuler.net/.
Само решение я скрываю в спойлере, чтобы вдруг кто захочет их сначала самостоятельно решить, не увидели сразу ответ.
Компилирую все свои программы g++ на линуксе. Но так же запускаю их в студии - Visual Studio 2012.
Возможно кому-то пригодятся мои решения для каких-то своих лабораторных или курсовых. По любым вопросам не стесняемся - пишем, критикуем и спрашиваем.

Комментарии к коду прилагаются. Сложные задачи расписываю.
Решения выкладываю по ходу исполнения. Их очень много, потому постепенно буду выкладывать в этот пост.
Перевод поверхностный. Только суть.

Итак. Приступим.

Задача №1.
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.
Найдите сумму всех чисел кратных 3 и 5 до 1000.

Решение.
Делаем в лоб. Проверкой в цикле.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <cassert>
#include <cstdlib>
#include <chrono>
 
int solve(int below)
{
        int sum = 0;
        for (int i = 1; i < below; ++i)
                if (i % 3 == 0 || i % 5 == 0) sum += i;
 
        return sum;
}
 
int main()
{
        assert(solve(10) == 23);
        auto  now = std::chrono::high_resolution_clock::now();
        auto answer = solve(1000);
        auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now() - now);
        std::cout << "Answer = " << answer << "\n";
        std::cout << "Time : " << elapsed.count() << "ns.\n";
        return 0;
}


Задача №2.
Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

Каждый новый элемент последовательности Фибоначчи генерируется суммой двух предыдущих элементов. Стартуя с 1 и 2, первые 10 элементов будут:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Рассматривая те элементы последовательности Фибоначчи, значение которых не превышает 4 миллиона, найти сумму всех положительных значений элементов.

Решение.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <cassert>
#include <cstdlib>
#include <chrono>
#include <vector>
 
long int solve(long int below)
{
        int prev = 1;
        int res = 2;
        long int sum = 0;
        while(res <= below)
        {
                if (res % 2 == 0) sum+= res;
                int c = prev;
                prev = res;
                res = c + res;
        }
        return sum;
}
 
int main()
{
        auto  now = std::chrono::high_resolution_clock::now();
        auto answer = solve(4000000);
        auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now() - now);
        std::cout << "Answer = " << answer << "\n";
        std::cout << "Time : " << elapsed.count() << "ns.\n";
        return 0;
}
Просмотров 794 Комментарии 4
Всего комментариев 4
Комментарии
  1. Старый комментарий
    Аватар для SatanaXIII
    Было бы хорошо переводить задание, а то вдруг кто не сильно силен в английском и не способен понять задание сразу. Такие люди скорее всего пройдут мимо, даже имея более красивое решение.
    Запись от SatanaXIII размещена 16.07.2014 в 14:06 SatanaXIII вне форума
  2. Старый комментарий
    Цитата:
    Сообщение от SatanaXIII Просмотреть комментарий
    Было бы хорошо переводить задание, а то вдруг кто не сильно силен в английском и не способен понять задание сразу. Такие люди скорее всего пройдут мимо, даже имея более красивое решение.
    Блин, вот так и знала, что будет такого рода замечание.
    Ладно. Переведу.
    Запись от Тамика размещена 16.07.2014 в 15:05 Тамика вне форума
  3. Старый комментарий
    Ошибка в переводе:
    Цитата:
    значение которых не превышает 4 миллиона, найти сумму всех положительных значений элементов.
    все значения в последовательности и так положительные
    Запись от Ev_Hyper размещена 21.07.2014 в 15:49 Ev_Hyper вне форума
  4. Старый комментарий
    Аватар для gray_fox
    В первом можно просто посчитать с помощью ариф. прогрессии: (сумма кратных 3) + (сумма кратных 5) - (сумма кратных 15).
    Запись от gray_fox размещена 27.07.2014 в 17:08 gray_fox вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru