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

Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1. - C++

Восстановить пароль Регистрация
 
fishec
 Аватар для fishec
118 / 118 / 30
Регистрация: 07.09.2013
Сообщений: 337
09.02.2014, 19:37     Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1. #1
Вектор длины N нужно заполнить случайными целыми числами(от X до Y) и сделать, чтобы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1. (N,X,Y - вводятся с клавиатуры)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2014, 19:37     Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1.
Посмотрите здесь:

написать функцию , котороя вводила сначала в масив числа, сначала с чётными, а потом нечётными индексами. C++
Упорядочить массив так, чтобы сначала иши упорядоченные положительные члены а потом упорядоченные отрицательные члены C++
Преобразуйте эту строчку так, чтобы сначала в ней шли цифры, а потом - все буквы исходной строчки... C++
C++ сортировка что бы в массиве сначала были все четные а потом все нечетные числа
C++ Переставить числа в массиве таким образом, чтобы сначала шли элементы меньше a[b], затем равные a[b], и потом большие
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vovacreme
-16 / 61 / 13
Регистрация: 14.01.2014
Сообщений: 145
09.02.2014, 20:41     Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1. #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
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
 
int main()
{
    int N, X, Y;
    cin >> N >> X >> Y;
    vector<int> vec, res_vec;
    generate_n(back_inserter(vec), N, [X, Y](){ return X + rand() % (Y - X + 1); });
    vector<int>::iterator it = find_if (vec.begin(), vec.end(), [](int x){ return x % 3 == 0; });
    while ( it != vec.end() )
    {
        res_vec.push_back(*it);
        it = find_if (it + 1, vec.end(), [](int x){ return x % 3 == 0; });
    }
    it = find_if (vec.begin(), vec.end(), [](int x){ return x % 3 == 2; });
    while ( it != vec.end() )
    {
        res_vec.push_back(*it);
        it = find_if (it + 1, vec.end(), [](int x){ return x % 3 == 2; });
    }
    it = find_if (vec.begin(), vec.end(), [](int x){ return x % 3 == 1; });
    while ( it != vec.end() )
    {
        res_vec.push_back(*it);
        it = find_if (it + 1, vec.end(), [](int x){ return x % 3 == 1; });
    }
    copy(res_vec.begin(), res_vec.end(), ostream_iterator<int>(cout, " "));
    cout << endl;
    system("pause");
}
fishec
 Аватар для fishec
118 / 118 / 30
Регистрация: 07.09.2013
Сообщений: 337
09.02.2014, 20:46  [ТС]     Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1. #3
Спасибо. Но, к сожалению, в задании нельзя использовать вспомогательный вектор.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.02.2014, 20:50     Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1. #4
ахтунг какой-то.
можно заюзать std::stable_sort или даже обычный сорт с спец предикатом,
который будет одни числа считать меньшими чем другие по указанным критериям
C++
1
2
3
4
5
6
auto pred = [] (int lhs, int rhs)
{
  // вот тут определяем всякие там кратности и т.п. и возвращаем
  true или false
};
std::stable_sort(vec.begin(), vec.end(), pred);
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.02.2014, 20:52     Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1. #5
fishec,
C++
1
2
3
4
5
6
7
8
9
bool comp(int a, int b)
{
    if (!(a%3)) return true;
    if (!(b%3)) return false;
    return ((a%3) > (b%3));
}
 
//......
sort(myvec.begin(), myvec.end(), comp);
fishec
 Аватар для fishec
118 / 118 / 30
Регистрация: 07.09.2013
Сообщений: 337
09.02.2014, 20:53  [ТС]     Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1. #6
Цитата Сообщение от vovacreme Посмотреть сообщение
generate_n(back_inserter(vec), N, [X, Y](){ return X + rand() % (Y - X + 1); });
в этой строке ошибка Expression syntax
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
09.02.2014, 20:55     Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1. #7
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
31
32
33
34
35
36
#include <algorithm>
#include <iostream>
 
class Div
{
public:
    Div(int divider, int modulo):
        divider_(divider),
        modulo_(modulo)
    { }
 
 
    bool operator()(int value) const
    {
        return (value % divider_) == modulo_;
    }
private:
    int divider_;
    int modulo_;
};
 
 
int main()
{
    std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9};
 
    auto end = std::partition(v.begin(), v.end(), Div(3, 0));
    end = std::partition(end, v.end(), Div(3, 2));
    end = std::partition(end, v.end(), Div(3, 1));
 
    for (const auto& item: v)
    {
        std::cout << item << " ";
    }
    std::cout << std::endl;
}
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
09.02.2014, 20:59     Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1. #8
fishec, полный вариант
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
31
32
33
34
#include "stdafx.h"
#include <iostream>     // std::cout
#include <algorithm>    // std::generate
#include <vector>       // std::vector
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand
#include <iterator>
 
using namespace std;
 
bool mycomp(int a, int b)
{
    if (!(a%3)) return true;
    if (!(b%3)) return false;
    return ((a%3) > (b%3));
}
 
int main()
{
    srand (unsigned(time(0)));
    int N, X, Y;
    cin >> N >> X >> Y;
    if ((X > Y) || (N < 1))
        return 1;
    
    vector<int> myvec;
    myvec.resize(N);
    generate_n(myvec.begin(), N, [X, Y](){ return X + rand() % (Y - X + 1); });
    sort(myvec.begin(), myvec.end(), mycomp);
    for (vector<int>::iterator it = myvec.begin() ; it!=myvec.end() ; ++it)
                cout<<*it << endl;
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2014, 21:00     Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1.
Еще ссылки по теме:

C++ Переписать файл так, чтобы сначала шли положительные, потом отрицательные числа
C++ Расположить элементы массива так, чтобы сначала были отрицательные и нули, а потом положительные
C++ Переписать файл целых чисел так, чтобы сначала шли положительные, а потом - отрицательные

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
09.02.2014, 21:00     Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1. #9
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
31
32
33
34
35
#include <algorithm>
#include <iostream>
#include <vector>
#include <random>
 
int main() {
 
    std::random_device rd;
    int n,x,y;
    std::cin >> n >> x >> y;
    std::uniform_int_distribution<> dis(x,y);
 
    std::vector<int> v(n);
    std::generate( v.begin(), v.end(), [&]{return dis(rd);} );
    
    
    std::sort( v.begin(), v.end(), [](int lhs, int rhs)
    {    
        int reml = lhs % 3;
        int remr = rhs % 3;
        
        if( reml == 0 ) reml = 3;
        if( remr == 0 ) remr = 3;
        return reml > remr;
    } 
    );
    
    for( int i: v )
    {
        std::cout << i << " ";
    }
    std::cout << std::endl;
 
    return 0;
}
Yandex
Объявления
09.02.2014, 21:00     Упорядочить вектор так, что бы сначала шли числа кратные 3, потом с остатком 2 при делении на 3, потом с остатком 1.
Ответ Создать тему
Опции темы

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