Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.90/10: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Montanaa
5 / 5 / 2
Регистрация: 21.03.2011
Сообщений: 79
1

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

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

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

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

Примеры алгоритмов для STL map
Помогите пожалуйста. Начал делать лабораторную работу. Суть задания:...

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

Разработать программу с использованием трех алгоритмов stl
Нужно разработать программу на языке С++ с использованием трех алгоритмов STL....

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

23
magirus
11.10.2011, 18:22
  #2

Не по теме:

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

0
Montanaa
5 / 5 / 2
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 18:26  [ТС] 3
в STL вроде как алгоритмы для этого есть, или нет?
библиотека numeric
1
diagon
Higher
1937 / 1203 / 120
Регистрация: 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/5c9c4db29782a66aa2975d7cef76a6fa

Добавлено через 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/d0fc864001edbcda3924f95d55fa7381
1
Сыроежка
Заблокирован
11.10.2011, 18:32 5
Цитата Сообщение от Montanaa Посмотреть сообщение
в STL вроде как алгоритмы для этого есть, или нет?
библиотека numeric
Есть алгоритм для подсчета суммы последовательности. Называется он, если память не изменяет, std::accumulate. Находите с помощью него сумму, а дальше уже сами определяете, является ли сумма простым числом, или нет.
Для второй задачи нужно выбрать разновидность алгоритма std::find для поиска последнего вхождения числа в последовательность с заданной последней цифрой. А затем вставляете туда новое число тем методом, который определен для вашей последовательности.

Кстати сказать, вы должны определиться, в каком виде задана ваша последовательность.
1
Nameless One
Эксперт С++
5786 / 3435 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
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 секунд

Не по теме:

Хе, опоздал :(

1
Montanaa
5 / 5 / 2
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 18:40  [ТС] 7
Спасибо огромное друзья !
А вторую задачку не можете тоже написать ?
0
Nameless One
Эксперт С++
5786 / 3435 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
11.10.2011, 18:44 8
Montanaa, в сообщении #5 все уже написано
1
diagon
Higher
1937 / 1203 / 120
Регистрация: 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/e39b625b676b373938088529e793be9e
1
Nameless One
Эксперт С++
5786 / 3435 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
11.10.2011, 18:48 10
Цитата Сообщение от diagon Посмотреть сообщение
Не придумал, как решить красиво, только так
ну, можно использовать find_if, которому будем передавать предикат, проверяющий, равна ли последняя цифра числа заданной
0
Montanaa
5 / 5 / 2
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 19:30  [ТС] 11
Еще вопросец. Для чего в 1ой задаче, в цикле "for (int i = 2, sq = sqrt(x); i <= sq; ++i)" cтоит корень из Х и почему его не воспринимает Вижуал Студио ?
0
Сыроежка
Заблокирован
11.10.2011, 19:39 12
Цитата Сообщение от Montanaa Посмотреть сообщение
Еще вопросец. Для чего в 1ой задаче, в цикле "for (int i = 2, sq = sqrt(x); i <= sq; ++i)" cтоит корень из Х и почему его не воспринимает Вижуал Студио ?
Наверное потому, что это имя из пространства имен std. Используйте запись std::sqrt.
0
Montanaa
5 / 5 / 2
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 19:44  [ТС] 13
Цитата Сообщение от Сыроежка Посмотреть сообщение
Наверное потому, что это имя из пространства имен std. Используйте запись std::sqrt.
.
нет. и для чего вообще этот корень там?
0
aeshes
442 / 205 / 21
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 19:51 14
нет, проблема в том, что вы ей передаете целое число
напишите sqrt((double)x) или sqrt(x+0.0)
0
Сыроежка
Заблокирован
11.10.2011, 19:52 15
Цитата Сообщение от Montanaa Посмотреть сообщение
.
нет. и для чего вообще этот корень там?
Что означает ваше "нет"?!

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

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

Какие могут быть проблемы с тем, что функции передается целое число?! Не объясните?!
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.10.2011, 19:55 16
Цитата Сообщение от Сыроежка Посмотреть сообщение
Какие могут быть проблемы с тем, что функции передается целое число?! Не объясните?!
C++
1
2
3
double sqrt (      double x );
      float sqrt (       float x );
long double sqrt ( long double x );
Я не вижу здесь ни одного прототипа для функции, которая принимала бы целое число.
0
Сыроежка
Заблокирован
11.10.2011, 19:59 17
Цитата Сообщение от fasked Посмотреть сообщение
C++
1
2
3
double sqrt (      double x );
      float sqrt (       float x );
long double sqrt ( long double x );
Я не вижу здесь ни одного прототипа для функции, которая принимала бы целое число.
А разве в С++ не существует преобразований выражений?
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.10.2011, 20:10 18
Цитата Сообщение от Сыроежка Посмотреть сообщение
А разве в С++ не существует преобразований выражений?
Неявных? Я думаю, это зависит от конкретных опций компилятора. По стандарту уже не помню как.
0
Сыроежка
Заблокирован
11.10.2011, 20:12 19
Цитата Сообщение от fasked Посмотреть сообщение
Неявных? Я думаю, это зависит от конкретных опций компилятора. По стандарту уже не помню как.

Так вы можете проверить, записав std::sqrt( 9 )?
0
aeshes
442 / 205 / 21
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 20:16 20
Сыроежка, мой компилятор VS2010 говорит мне на sqrt(1) - ambiguous call и std::sqrt(1) тут не помогает, потому что компилятор не может выброать, к какой из типов (float, double, long double) преобразовать неявным преобразованием
И это типичная проблема для компиляторов микрософта
Может в других и не так, но у ТС имено студия, а в ней так
1
11.10.2011, 20:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2011, 20:16

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

Использование STL - C++
Из списков s1 и s2 удалить все элементы с одинаковым содержимым. #include...

Использование STL
Реализуйте задание с использованием контейнеров и алгоритмов библиотеки STL...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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