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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Montanaa
5 / 5 / 1
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 18:19     Использование алгоритмов STL #1
Здравствуйте.
Ребят пожалуйста решите 2 простенькие задачки, потратьте немного своего времени, очень прошу.
Заранее огромное спасибо вам!
1) Дана последовательность целых чисел. Определить, является ли сумма элементов простым числом.
2) Дана последовательность целых чисел. Вставить новый элемент после всех элементов, которые заканчиваются на заданную цифру.
Пожалуйста !
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
magirus
11.10.2011, 18:22
  #2

Не по теме:

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

Montanaa
5 / 5 / 1
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 18:26  [ТС]     Использование алгоритмов STL #3
в STL вроде как алгоритмы для этого есть, или нет?
библиотека numeric
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.10.2011, 18:31     Использование алгоритмов STL #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     Использование алгоритмов STL #5
Цитата Сообщение от Montanaa Посмотреть сообщение
в STL вроде как алгоритмы для этого есть, или нет?
библиотека numeric
Есть алгоритм для подсчета суммы последовательности. Называется он, если память не изменяет, std::accumulate. Находите с помощью него сумму, а дальше уже сами определяете, является ли сумма простым числом, или нет.
Для второй задачи нужно выбрать разновидность алгоритма std::find для поиска последнего вхождения числа в последовательность с заданной последней цифрой. А затем вставляете туда новое число тем методом, который определен для вашей последовательности.

Кстати сказать, вы должны определиться, в каком виде задана ваша последовательность.
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
11.10.2011, 18:38     Использование алгоритмов STL #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  [ТС]     Использование алгоритмов STL #7
Спасибо огромное друзья !
А вторую задачку не можете тоже написать ?
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
11.10.2011, 18:44     Использование алгоритмов STL #8
Montanaa, в сообщении #5 все уже написано
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
11.10.2011, 18:45     Использование алгоритмов STL #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
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
11.10.2011, 18:48     Использование алгоритмов STL #10
Цитата Сообщение от diagon Посмотреть сообщение
Не придумал, как решить красиво, только так
ну, можно использовать find_if, которому будем передавать предикат, проверяющий, равна ли последняя цифра числа заданной
Montanaa
5 / 5 / 1
Регистрация: 21.03.2011
Сообщений: 79
11.10.2011, 19:30  [ТС]     Использование алгоритмов STL #11
Еще вопросец. Для чего в 1ой задаче, в цикле "for (int i = 2, sq = sqrt(x); i <= sq; ++i)" cтоит корень из Х и почему его не воспринимает Вижуал Студио ?
Сыроежка
Заблокирован
11.10.2011, 19:39     Использование алгоритмов STL #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  [ТС]     Использование алгоритмов STL #13
Цитата Сообщение от Сыроежка Посмотреть сообщение
Наверное потому, что это имя из пространства имен std. Используйте запись std::sqrt.
.
нет. и для чего вообще этот корень там?
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 19:51     Использование алгоритмов STL #14
нет, проблема в том, что вы ей передаете целое число
напишите sqrt((double)x) или sqrt(x+0.0)
Сыроежка
Заблокирован
11.10.2011, 19:52     Использование алгоритмов STL #15
Цитата Сообщение от Montanaa Посмотреть сообщение
.
нет. и для чего вообще этот корень там?
Что означает ваше "нет"?!

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

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

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

Так вы можете проверить, записав std::sqrt( 9 )?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2011, 20:16     Использование алгоритмов STL
Еще ссылки по теме:

C++ Сортировка списка строк с использованием стандартных алгоритмов библиотеки STL
Использование стандартных компонентов stl C++
C++ Использование list stl для вывода в файл

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

Или воспользуйтесь поиском по форуму:
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 20:16     Использование алгоритмов STL #20
Сыроежка, мой компилятор VS2010 говорит мне на sqrt(1) - ambiguous call и std::sqrt(1) тут не помогает, потому что компилятор не может выброать, к какой из типов (float, double, long double) преобразовать неявным преобразованием
И это типичная проблема для компиляторов микрософта
Может в других и не так, но у ТС имено студия, а в ней так
Yandex
Объявления
11.10.2011, 20:16     Использование алгоритмов STL
Ответ Создать тему
Опции темы

Текущее время: 09:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru