给定一系列数字报告,哪些重复和重复了多少次

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

本文关键字:多少次 一系列 数字 报告      更新时间:2023-10-16

例如

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

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

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 << " timesn";
        }
    }
}

std::map是一个关联容器。

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

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

你有和它的定义。单词是一个定义是一个值。

std::map<int,       int> map;
         ^^^        ^^^
          |           |
         key type    value type
您可以使用运算符引用

[]值。

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

您还可以使用迭代器检查映射中的所有键值

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用于表达

它有 first 个和 second 个成员,代表第一和第二值,成对排列。

在 map 的情况下,first 是一个second是一个

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

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

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

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.使用像std::vector这样的STL类型可以为您节省很多麻烦。

  1. 你说"插入 m 个数字",但for (i=1; i<m; i++)会循环 m-1 次,这可能不是你想要的。
  2. 作为补充建议,你应该对从外部世界获得的变量进行输入检查,比如cin >> m;,因为它可以是零或负数。