C ++ подсчитывает разные числа - PullRequest
1 голос
/ 27 марта 2012

Программа должна считать разные числа от стандартного ввода.Например, при вводе

6 <- how many numbers
1
3
1
4
3
786345

он должен выдавать

4

Вот мое решение, хотя оно слишком медленное.Есть ли более быстрый способ?

#include <cstdlib>
#include <iostream>
#include <vector>

using namespace std;

vector<int> occured; //vector of numbers that occured already

/*
    int findType(int find)
    finds where given number should be, I want to keep this array sorted.
    in case of number existed already return -1; otherwise return the index for inserting.
*/
int findType(int find) 
{
    for (int i=0; i<occured.size(); i++) //for each number in occured array
        if (find==occured[i]) return -1; //if it is same return it occured
        else if (find<occured[i]) return i;
    return occuerd.size();
};

int main(int argc, char *argv[])
{
     int n; // read how many numbers will be given
    cin>>n;
    int tmp; //temp variables.
    int tmp2; 

    for (int i=0; i<n; i++) //for each number
    {
        cin>>tmp;       //get it
        if ((tmp2=findType(tmp))!=-1)  //check if it occured
           occured.insert(occured.begin()+tmp2,tmp); // if not add it to occured vector.
    }
    cout<<occured.size(); //print how many different numbers

    //system("PAUSE"); //uncomment if needed
    return 0;
}

Ответы [ 2 ]

6 голосов
/ 27 марта 2012

Как насчет использования std::set вместо std::vector? Это обеспечит отсутствие записи дважды (вам не нужно проверять это; она также будет отсортирована), плюс вам просто нужно получить размер, чтобы узнать количество различных элементов.

Пример:

std::set<int> occured;
int tmp;
int n = 10; // or input it

for (int i=0; i<n; i++) {
    cin >> tmp;
    occured.insert(tmp);
}

cout << occured.size();
3 голосов
/ 27 марта 2012

Для начала, используйте push_back(), чтобы вставить вход в std::vector.Когда у вас есть все входные данные, используйте std::sort и std::unique для вектора.Что-то вроде:

std::vector<int> numbers;
int nextValue;
while ( std::cin >> nextValue ) {
    numbers.push_back( nextValue );
}
std::sort(numbers.begin(), numbers.end());
int results = std::unique(numbers.begin(), numbers.end()) - numbers.begin();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...