Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Montanaa
5 / 5 / 1
Регистрация: 21.03.2011
Сообщений: 79
#1

Использование алгоритмов STL - C++

11.10.2011, 18:19. Просмотров 1712. Ответов 23
Метки нет (Все метки)

Здравствуйте.
Ребят пожалуйста решите 2 простенькие задачки, потратьте немного своего времени, очень прошу.
Заранее огромное спасибо вам!
1) Дана последовательность целых чисел. Определить, является ли сумма элементов простым числом.
2) Дана последовательность целых чисел. Вставить новый элемент после всех элементов, которые заканчиваются на заданную цифру.
Пожалуйста !
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2011, 18:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование алгоритмов STL (C++):

Реализация алгоритмов библиотеки STL - C++
Ребят помогите пожалуйста, как создать програмку, которая бы создавала массив 4 на 3, и заполняла его рандомом. Еще нужно потом вывести...

Примеры алгоритмов для STL map - C++
Помогите пожалуйста. Начал делать лабораторную работу. Суть задания: реализовать для map 5 алгоритмов sort, copy, none_of, find_if,...

Продемонстрировать работу алгоритмов STL copy, и max_element - C++
есть задания 1)Создайте пустой целочисленный вектор и поместите в него 10 случайных чисел с интервалом значений от -15 до 15. 2)Напишите...

Сортировка списка строк с использованием стандартных алгоритмов библиотеки STL - C++
Сортировка слов по количеству в них букв 'А'. Сортировка списка строк с использованием стандартных алгоритмов библиотеки STL. Мне не...

Как скопировать массив в вектор одной строкой без использования циклов и алгоритмов STL? - C++
Уважаемые формучане, не подскажете, как скопировать массив в вектор одной строкой без использования циклов и алгоритмов STL?

использование stl - C++
Тема для читателей книг и учебников... Такой способ работы с векторами верен или нет (код рабочий) с точки зрения теории: #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
magirus
11.10.2011, 18:22
  #2

Не по теме:

а стл тут причем?

Montanaa
5 / 5 / 1
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 18:26  [ТС] #3
в STL вроде как алгоритмы для этого есть, или нет?
библиотека numeric
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.10.2011, 18:31 #4
Непонятно, на кой здесь STL, но можно как-то так
1)
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
 
bool isPrime( int x )
{
    for (int i = 2, sq = sqrt(x); i <= sq; ++i)
        if ( x % i == 0 )
            return false;
    return true;
}
 
int main()
{
    int arr[] = { 1, 2, 3, 5 };
    std::vector<int> vec( arr, arr + sizeof(arr) / sizeof(*arr) );
    int sum = 0;
    std::for_each( vec.begin(), vec.end(), [&sum] ( int x )
    {
        sum += x;
    } );
    
    std::cout << std::boolalpha << isPrime(sum);
}
результат: http://liveworkspace.org/code/5c9c4d...975d7cef76a6fa

Добавлено через 2 минуты
Цитата Сообщение от Montanaa Посмотреть сообщение
в STL вроде как алгоритмы для этого есть, или нет?
библиотека numeric
Кстати да, тогда можно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <numeric>
 
bool isPrime( int x )
{
    for (int i = 2, sq = sqrt(x); i <= sq; ++i)
        if ( x % i == 0 )
            return false;
    return true;
}
 
int main()
{
    int arr[] = { 1, 2, 3, 5 };
    std::vector<int> vec( arr, arr + sizeof(arr) / sizeof(*arr) );
    
    std::cout << std::boolalpha << isPrime(std::accumulate( vec.begin(), vec.end(), int() ) );
}
Результат: http://liveworkspace.org/code/d0fc86...24f95d55fa7381
Сыроежка
Заблокирован
11.10.2011, 18:32 #5
Цитата Сообщение от Montanaa Посмотреть сообщение
в STL вроде как алгоритмы для этого есть, или нет?
библиотека numeric
Есть алгоритм для подсчета суммы последовательности. Называется он, если память не изменяет, std::accumulate. Находите с помощью него сумму, а дальше уже сами определяете, является ли сумма простым числом, или нет.
Для второй задачи нужно выбрать разновидность алгоритма std::find для поиска последнего вхождения числа в последовательность с заданной последней цифрой. А затем вставляете туда новое число тем методом, который определен для вашей последовательности.

Кстати сказать, вы должны определиться, в каком виде задана ваша последовательность.
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
11.10.2011, 18:38 #6
Цитата Сообщение от diagon Посмотреть сообщение
Непонятно, на кой здесь STL, но можно как-то так
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
#include <iostream>
#include <numeric>
#include <functional>
#include <vector>
#include <cmath>
 
bool is_prime(int x)
{
        for (int i = 2, sq = sqrt(x); i <= sq; ++i)
                if ( x % i == 0 )
                        return false;
        return true;
}
 
int main()
{
    std::vector<int> ivec = {1, 2, 3, 5};
 
    std::cout << std::boolalpha << (is_prime(std::accumulate(
                         ivec.begin(),
                         ivec.end(), 0,
                         std::plus<int>()))) // последний параметр необязателен в данном случае
          << std::endl;
    
    return 0;
}
Добавлено через 40 секунд

Не по теме:

Хе, опоздал

Montanaa
5 / 5 / 1
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 18:40  [ТС] #7
Спасибо огромное друзья !
А вторую задачку не можете тоже написать ?
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
11.10.2011, 18:44 #8
Montanaa, в сообщении #5 все уже написано
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.10.2011, 18:45 #9
Цитата Сообщение от Montanaa Посмотреть сообщение
2) Дана последовательность целых чисел. Вставить новый элемент после всех элементов, которые заканчиваются на заданную цифру.
Не придумал, как решить красиво, только так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
 
int main()
{
    int arr[] = { 122, 123, 124, 324, 4 };
    std::vector<int> vec( arr, arr + sizeof(arr) / sizeof(*arr) );
    int digit = 4; //последняя цифра
    int new_element = 100500; // новый элемент
    std::vector<int> new_vec;
    
    std::for_each( vec.begin(), vec.end(), [&] ( int x )
    {
        new_vec.push_back(x);
        if ( x % 10 == digit )
            new_vec.push_back( new_element );
    } );
    
    std::cout << "Answer: ";
    std::copy( new_vec.begin(), new_vec.end(), std::ostream_iterator<int> (std::cout, " ") );
}
Результат: http://liveworkspace.org/code/e39b62...088529e793be9e
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
11.10.2011, 18:48 #10
Цитата Сообщение от diagon Посмотреть сообщение
Не придумал, как решить красиво, только так
ну, можно использовать find_if, которому будем передавать предикат, проверяющий, равна ли последняя цифра числа заданной
Montanaa
5 / 5 / 1
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 19:30  [ТС] #11
Еще вопросец. Для чего в 1ой задаче, в цикле "for (int i = 2, sq = sqrt(x); i <= sq; ++i)" cтоит корень из Х и почему его не воспринимает Вижуал Студио ?
Сыроежка
Заблокирован
11.10.2011, 19:39 #12
Цитата Сообщение от Montanaa Посмотреть сообщение
Еще вопросец. Для чего в 1ой задаче, в цикле "for (int i = 2, sq = sqrt(x); i <= sq; ++i)" cтоит корень из Х и почему его не воспринимает Вижуал Студио ?
Наверное потому, что это имя из пространства имен std. Используйте запись std::sqrt.
Montanaa
5 / 5 / 1
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 19:44  [ТС] #13
Цитата Сообщение от Сыроежка Посмотреть сообщение
Наверное потому, что это имя из пространства имен std. Используйте запись std::sqrt.
.
нет. и для чего вообще этот корень там?
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 19:51 #14
нет, проблема в том, что вы ей передаете целое число
напишите sqrt((double)x) или sqrt(x+0.0)
Сыроежка
Заблокирован
11.10.2011, 19:52 #15
Цитата Сообщение от Montanaa Посмотреть сообщение
.
нет. и для чего вообще этот корень там?
Что означает ваше "нет"?!

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

Добавлено через 36 секунд
Цитата Сообщение от aeshes Посмотреть сообщение
нет, проблема в том, что вы ей передаете целое число
напишите sqrt((double)x) или sqrt(x+0.0)

Какие могут быть проблемы с тем, что функции передается целое число?! Не объясните?!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2011, 19:52
Привет! Вот еще темы с ответами:

Использование STL в DLL-файлах - C++
Хочу использовать библиотеку STL в своем DLL-проекте. В частности для обеспечения функциональности требуется применение классов vector и...

Использование стандартных компонентов stl - C++
Помогите реализовать задачу с помощью stl Даны натуральное число n, действительные числа a1, ... , a2n . Вычислить (задание на снимке) я...

Использование двух контейнеров из STL - C++
Нужно, чтобы: 1) Каждый объект имел свой уникальный ключ. 2) Быстрая выборка по ключу. 3) Быстрое прохождение по всем объектам. ...

Использование класса list STL - C++
Здравствуйте, у меня есть базовый класс и унаследованный от него. Мне надо хранить в этом одном списке либо указатели на объекты базового...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.10.2011, 19:52
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru