Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
5 / 5 / 2
Регистрация: 21.03.2011
Сообщений: 79
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Ребят пожалуйста решите 2 простенькие задачки, потратьте немного своего времени, очень прошу.
Заранее огромное спасибо вам!
1) Дана последовательность целых чисел. Определить, является ли сумма элементов простым числом.
2) Дана последовательность целых чисел. Вставить новый элемент после всех элементов, которые заканчиваются на заданную цифру.
Пожалуйста !
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2011, 18:19
Ответы с готовыми решениями:

Использование алгоритмов STL
Створити клас, який описує та забезпечує дії над даними параметризованого масиву, розмірність якого...

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

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

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

23
magirus
11.10.2011, 18:22
  #2

Не по теме:

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

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

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

Кстати сказать, вы должны определиться, в каком виде задана ваша последовательность.
1
Эксперт С++
5828 / 3479 / 358
Регистрация: 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
5 / 5 / 2
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 18:40  [ТС] 7
Спасибо огромное друзья !
А вторую задачку не можете тоже написать ?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.10.2011, 18:44 8
Montanaa, в сообщении #5 все уже написано
1
Higher
1953 / 1219 / 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/... 29e793be9e
1
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
11.10.2011, 18:48 10
Цитата Сообщение от diagon Посмотреть сообщение
Не придумал, как решить красиво, только так
ну, можно использовать find_if, которому будем передавать предикат, проверяющий, равна ли последняя цифра числа заданной
0
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
5 / 5 / 2
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 19:44  [ТС] 13
Цитата Сообщение от Сыроежка Посмотреть сообщение
Наверное потому, что это имя из пространства имен std. Используйте запись std::sqrt.
.
нет. и для чего вообще этот корень там?
0
448 / 211 / 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
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
11.10.2011, 20:10 18
Цитата Сообщение от Сыроежка Посмотреть сообщение
А разве в С++ не существует преобразований выражений?
Неявных? Я думаю, это зависит от конкретных опций компилятора. По стандарту уже не помню как.
0
Заблокирован
11.10.2011, 20:12 19
Цитата Сообщение от fasked Посмотреть сообщение
Неявных? Я думаю, это зависит от конкретных опций компилятора. По стандарту уже не помню как.

Так вы можете проверить, записав std::sqrt( 9 )?
0
448 / 211 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2011, 20:16
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru