0

例如

1 1 1 1 2 3 3 4 5 5 5

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

这是代码,但它有一些问题

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";
4

3 回答 3

4

你应该学习算法和数据结构。这使您的代码更简单。仅使用保存对的关联容器

a number --> how many times it repeats

可以充分简化您的程序

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是一个关联容器。

您可以将其视为key-->value具有唯一键的存储。

真实单词中的示例是字典:

那里有word和它的定义。词是定义是值。

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

您可以使用运算符引用值[]

这就像通常的数组一样工作,除了你使用你的key而不是索引

您还可以使用迭代器检查存储在地图中的所有键值

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

正如我所指出的,map 保存了键值

并且在标准 C++ 库struct std::pair中用于表示pair

它具有firstsecond成员,代表第一个和第二个值,成对存储。

在地图的情况下,first是一个second是一个

同样,我们将一个数字存储为一个键,以及它在一个值中重复的次数。

然后,我们读取用户输入并增加给定键的

之后,我们只需检查存储在地图中的所有元素并打印它们。

于 2013-06-08T13:43:42.767 回答
0
  1. 你说“插入 m 个数字”,但for (i=1; i<m; i++)会循环 m-1 次,这可能不是你想要的。
  2. 作为补充建议,您应该对从外部 world.like 获取的变量进行输入检查cin >> m;,因为它可以为零或负数。
于 2013-06-08T13:54:28.137 回答
0
int num_rep[m]; //array of repeated numbers
int cant_rep[m]; // array of correspondent number of repetitions

这里,m 只有在运行时才知道,数组大小必须在编译时知道。改为使用std::vector

代码看起来像一个 C 风格的 C++ 程序:

1.你不需要在块的开头声明变量。在使用前声明它们,它更具可读性。

2.使用STLlike类型std::vector可以为你省去很多这样的程序的麻烦。

于 2013-06-08T13:36:04.270 回答