如何计算遇到每个数字的次数?

时间:2015-08-17 03:43:11

标签: c++ arrays loops if-statement

我正在尝试编写一个程序来计算程序遇到的每个数字。通过将M作为数组元素数量的输入,Max表示最大数量,就像在M [i]中写入输入时不应超过此数字。出于某种原因,当我输入像

这样的小输入时,程序运行正常

数据输入:

10 3
1 2 3 2 3 1 1 1 1 3

答案:

5 2 3

但是当我为数组元素输入像364这样的大输入时,例如最大值为15。输出没有按预期工作,我无法找到原因!

#include "stdafx.h"
#include <iostream>
#include<fstream>
#include<string>
#include <stdio.h>
#include<conio.h>
using namespace std;

int  ArrayValue;
int Max;
int M[1000];
int checker[1000];
int element_cntr = 0;
int cntr = 0;
int n = 0;
void main()
{

    cout << "Enter the lenght of the Elements, followed by the maximum number: " << endl;
    cin >> ArrayValue>> Max;

    for (int i = 0; i < ArrayValue; i++)
    {
        cin >> M[i];
        checker[i]= M[i] ;
        element_cntr++;

        if (M[i] > Max)
        {
            cout << "the element number " << element_cntr << " is bigger than " << Max << endl;
        }


    }


    for (int i = 0; i < Max; i++)
    {
        cntr = 0;
        for (int j = 0; j < ArrayValue; j++)
        {

            if (M[n] == checker[j])
            {
                cntr+=1;

            }       

        }


        if (cntr != 0)
        {
            cout << cntr << " ";
        }
        n++;
    }





}

1 个答案:

答案 0 :(得分:0)

您有一般算法问题和一些代码问题,这些代码问题使代码难以维护,不可读并且令人困惑。这就是为什么你不明白它为什么不起作用的原因。

让我们一步一步地检讨它。

输出错误的实际原因是,当您需要遍历第一个Max整数时,只迭代数组的第一个Max项。例如,让我们输入:

7 3
1 1 1 1 1 2 3

正确的答案是:5 1 1,你的程序将输出5 5 5,因为在输出循环中它将遍历前三项并为它们输出:

 for (int i = 0; i < Max; i++)
    for (int j = 0; j < ArrayValue; j++)
        if (M[n] == checker[j]) // M[0] is 1, M[1] is 1 and M[2] is 1

它将输出初始数组的前三项的答案。在您的示例中,它工作正常,因为前三项是1 2 3 为了使其有效,您需要将条件更改为

if (n == checker[j]) // oh, why do you need variable "n"? you have an "i" loop!
{
    cntr += 1;
}    

它会起作用,但你的代码和算法都绝对不正确......

不是那个合适的解决方案

您有一个不必要的变量element_cntr - 循环变量i将提供相同的值。你正在重复它的价值。

此外,在输出循环中,您创建了一个变量n,而您有一个循环变量i,它与相同。您可以安全地删除变量n并将if (M[n] == checker[j])替换为if (M[i] == checker[j])

此外,如果变量checker ,您的M数组是完整副本。你为什么要复制所有的值? :)

你的代码应该至少看起来像这样:

using namespace std;

int ArrayValue;
int Max;
int M[1000];
int cntr = 0;

int main()
{

    cout << "Enter the lenght of the Elements, followed by the maximum number: " << endl;
    cin >> ArrayValue >> Max;

    for (int i = 0; i < ArrayValue; i++)
    {
        cin >> M[i];

        if (M[i] > Max)
        {
            cout << "the element number " << i << " is bigger than " << Max << endl;
        }
    }


    for (int i = 0; i < Max; i++)
    {
        cntr = 0;
        for (int j = 0; j < ArrayValue; j++)
        {
            if (i == M[j])
            {
                cntr ++;
            }      
        }

        if (cntr != 0)
        {
            cout << cntr << " ";
        }
    }

    return 0;
}

正确的解决方案

为什么你需要一个嵌套循环?您可以执行O(n*m)次操作来计算项目的出现次数。可以使用O(n)操作轻松计算。

在阅读时算一下:

using namespace std;

int arraySize;
int maxValue;
int counts[1000];

int main()
{

    cout << "Enter the lenght of the Elements, followed by the maximum number: " << endl;
    cin >> arraySize >> maxValue;

    int lastReadValue;

    for (int i = 0; i < arraySize; i++)
    {
        cin >> lastReadValue;

        if (lastReadValue > maxValue)
            cout << "Number " << i << " is bigger than maxValue! Skipping it..." << endl;
        else
            counts[lastReadValue]++; // read and increase the occurence count
    }


    for (int i = 0; i <= maxValue; i++)
    {
        if (counts[i] > 0)          
            cout << i << " occurences: " << counts[i] << endl; // output existent numbers
    }

    return 0;
}