我正在尝试编写一个程序来计算程序遇到的每个数字。通过将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++;
}
}
答案 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;
}