排序并显示位数

时间:2018-11-27 20:48:41

标签: c++ sorting logic cout

我想让我的程序可以对输入的整数进行排序并计算输入的任何整数的数量,但我不知道应该将c的cout写入哪里 例 a [9] = {2,3,2,6,6,3,5,2,2} 2的数目是4 3的数目是2 6的数目是2 。 。 请修复此代码

int main()
{
cout << "please enter the number of digites :" << endl;
int n;
cin>>n;
int a[n];
cout<<"enter numbers :"<<endl;
for(int i=0;i<n;i++)
    cin>>a[i];


     int i,j;

for(i=0;i<n-1;i++)
{
    for(j=0;j<n-i-1;j++)
        if(a[j]>a[j+1])
        {
            int temp;
            temp=a[j+1];
            a[j+1]=a[j];
            a[j]=temp;
        }
}

int c;
for(int m=0;m<n;m++)
{
    if(a[m]==a[m+1])
        c++;
    else
        c=0;
}



return 0;
}

2 个答案:

答案 0 :(得分:3)

通读我的解决方案,我已评论了更改的部分。我整理了一下。

要回答您的问题,:在将count变量重置为1之前,应先打印输出(数组中整数的频率)。这将起作用,因为我们已经对数组进行了排序,但不会必须提前寻找更多当前号码。

[编辑]我也在您的代码上方添加了此代码:

#include <iostream>
#include <vector>
using namspace std;

完整解决方案

#include <iostream>
#include <vector>

using namespace std;

int main() {
    // Get input
    int n;
    cout << "Please enter the number of digits: ";
    cin>>n;

    vector<int> a;
    cout << "Enter " << n << " numbers: " << endl;
    for(int i=0;i<n;i++) {
        int temp;
        cin >> temp;
        a.push_back(temp);
    }

    // Sort input
    int i,j;
    for (i = 0; i < a.size(); i++) {
        for(j = 0; j < a.size()-i-1; j++) {
            if(a[j] > a[j+1]) {
                int temp;
                temp=a[j+1];
                a[j+1]=a[j];
                a[j]=temp;
            }
        }
    }

    // If an element is in an array
    // we can not have 0 occurrences
    // of that element, hence count
    // must start at 1
    int count = 1;

    // Int to count
    int current = a[0];

    // Ouput if we have reset the count,
    // or if it is the last iteration
    bool output;

    // Loop through array
    for (int i = 1; i < a.size(); i++) {
        output = false; // Reset output if we have printed
        if (a[i] == current) {
            // If current int and the element next to it are the same,
            // increase the count
            count++;
        } else {
            // If current and next are different,
            // we need to show the frequency,
            // and then reset count to 1
            cout << current << " occurs " << count << " times" << endl;
            count = 1;
            current = a[i];
        }
    }

    // Output one last time, for last int in sorted set
    cout << current << " occurs " << count << " times" << endl;

    return 0;
}

如果这没有帮助,请阅读此页,它是C语言中的解决方案,但可以轻松地适应C ++。 https://codeforwin.org/2015/07/c-program-to-find-frequency-of-each-element-in-array.html这将帮助您理解和编写任务。他们将逐步指导您完成算法。

答案 1 :(得分:0)

这是std::map的典型用例。 std::map<char,int>使您可以轻松计算字符的频率(将用户输入视为字符而不是将其转换为数字更容易)。

这基本上就是您所需要的:

#include <iostream>
#include <iterator>
#include <map>

int main(){
  std::istream_iterator<char> it( std::cin );
  std::istream_iterator<char> end_of_input;
  std::map<char,int> data;
  while (it != end_of_input ) data[*(it++)]++;
  for (const auto& e : data) std::cout << e.first << " " << e.second << "\n";
}

这可能一次很多,所以让我们一个个地走。

std::istream_iterator<char>使您可以像从容器中迭代一样从流中提取字符。因此while迭代std::cin直到到达输入的末尾。然后*(it++)递增迭代器并返回从流中提取的字符。 data[x]++访问映射中的键x的值并递增其值。如果映射中的键尚无值,则默认将其初始化为0

对于输入:11223它会打印

1 2
2 2
3 1

您的代码存在一些问题,不确定是否可以全部捕获...

您在这里使用VLA(可变长度数组):int a[n];。这是编译器扩展,不是标准的c ++。

您无法访问数组。当i == 0时,j上升到j<n-i-1 == n-1,然后您访问a[j+1] == a[n],但是数组的最后一个有效索引是n-1。另一个循环(a[m+1])中存在相同的问题。

假设排序工作正常,最后一个循环几乎可以为您提供元素数量,但是要修正它,您可以将其更改为...

int current = a[0];
int counter = 1;
for(int m=1;m<n;m++) {
   if(a[m] == current) {
       counter++;
   } else {
       std::cout << current << " appears " << counter << " times" << endl;
       counter=1;   // note: minimum freq is 1 not 0
       current = a[m];
   }
}