Ricardo Zorio
Ricardo Zorio

Reputation: 292

Given a sequence of numbers report which have been repeated and how many times

for example

1 1 1 1 2 3 3 4 5 5 5

1 repeated 3 times,
3 repeated 1 time,
5 repeated 2 times

here's the code but it has some troubles

int i, k, m, number, number_prev, e;
cout << "Insert how many numbers: ";
cin >> m;
cout << "insert number";
cin >> number;
number_prev = number;
int num_rep[m]; //array of repeated numbers
int cant_rep[m]; // array of correspondent number of repetitions
e = 0;

for (i=1; i<m; i++) 
{
    cin >> number; 
    if (number == number_prev)
    {
        if (number == num_rep[e-1])
            cant_rep[e-1]++;
        else
        {
            num_rep[e] = number;
            cant_rep[e] = e + 1;
            e++;
        }
    }
    else
        e = 0;
    number_prev = number;
}

for (k = 0; k < e; k++)
    cout << "\nnumber " << num_rep[k] << " repeated " << cant_rep[k] << " times.\n";

Upvotes: 0

Views: 1198

Answers (3)

Lol4t0
Lol4t0

Reputation: 12547

You should learn algorithms and data structures. This make your code simpler. just using associative container that saves pair

a number --> how many times it repeats

can simplify your program sufficiently

int main()
{
    std::map<int, int> map;
    int v;
    while(std::cin >> v) {
        map[v]++;
    }
    for (auto it = map.cbegin(); it != map.cend(); ++it) {
        if (it->second > 1) {
            std::cout << it->first << " repeats " << it->second - 1 << " times\n";
        }
    }
}

std::map is an associative container.

You can think about it as a key-->value storage with unique keys.

The example in real word is a dictionary:

There you have word and its definition. The word is a key and the definition is a value.

std::map<int,       int> map;
         ^^^        ^^^
          |           |
         key type    value type

You can refer to values using [] operator.

this works like usual array, except instead of index you use your key.

You can also examine all key-value pairs, storied in the map using iterators.

it = map.cbegin(); // refers to the first key-value pair in the map
++it; // moves to the next key-value pair
it != map.cend(); // checks, if we at the end of map, so examined all elements already

As, I pointed out, map saves key-value pairs.

And in Standard C++ library struct std::pair is used to express pair.

It has first and second members, that represents first and second values, storied in a pair.

In the case of map, first is a key, and second is a value.

Again, we are storing a number as a key and how many times it repeats in a value.

Then, we read user input and increase value for the given key.

After that, we just examine all elements stored in a map and print them.

Upvotes: 4

guozhu cheng
guozhu cheng

Reputation: 151

  1. you say "Insert m numbers", but for (i=1; i<m; i++) will loop m-1 times, which might not is what you want.
  2. as a supplement advice, you should do input check for the variables get from external world.like cin >> m;, for it can be zero or negative.

Upvotes: 0

Yu Hao
Yu Hao

Reputation: 122383

int num_rep[m]; //array of repeated numbers
int cant_rep[m]; // array of correspondent number of repetitions

Here, m is only known when running, array sizes must be known in compile time. use std::vector instead.

The code seems like a C-style C++ program:

1.You don't need to declare variables in the beginning of block. Declare them before use, it's more readable.

2.Use the STL types like std::vector can save you a lot of trouble in programs like this.

Upvotes: 0

Related Questions