我的程序应该在2D数组中找到两个最大的元素。第一个元素一切正常,程序认为它是正确的,但是第二个元素存在很大的问题,因为我得到了错误的值。我知道有关于在数组中查找第二大元素的信息,但对于2D数组我找不到任何东西。
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n,m,sum=0;
int max=-1000001;
int maxsecond=-1000001,maxdu=0;
cin>> n>>m;
int a[10][10];
for (int i=1; i<n; i++)
{
for (int j=1; j<m; j++)
{
cin>>a[i][j];
}
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(a[i][j]>max)
{
maxsecond=max;
max=a[i][j];
}
else if (a[i][j]>maxsecond)
{
maxsecond=a[i][j];
}
}
}
cout<<endl;
cout<<max<<" "<<maxsecond;
}
输入:
2 3
4 8 5
2 1 7
我应该得到的输出:
8 7
我现在得到的输出:
8 4
答案 0 :(得分:0)
撇开注释中指出的问题,您的代码在输入行中缺少等号,因此不会在所有用户输入中读取该代码。例如,该代码仅从示例输入中读取两个数字。如下所示在比较运算符中添加等号即可解决该问题:
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
{
cin >> a[i][j];
}
}
答案 1 :(得分:0)
首先:您扫描的输入错误。您正在尝试将(int i=1; i<n; i++)
和(int j=1; j<m; j++)
范围的输入读入2D数组,并从1开始直到<n
都在读n-1
元素。您进行比较的代码是正确的,但是索引的方式是错误的。
您只需将读取和比较的索引都修改为(int i=0; i<n; i++)
和(int j=0; j<m; j++)
,就可以解决此问题。
第二:您的主要功能是“ int main()
”,但您忘了在末尾添加“ return 0
”
建议:由于您要从用户那里获取2D数组(矩阵)的大小,因此我建议为此使用STL向量。您可以在输入后调整向量的大小。这是一个例子
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<vector<int> >a;
int max=-1000001;
int maxsecond=-1000001,maxdu=0;
int n,m;
cin>>n>>m;
a.resize(n,vector<int>(m,0)); //Creates n x m matrix
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
{
cin>>a[i][j];
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(a[i][j]>max)
{
maxsecond=max;
max=a[i][j];
}
else if (a[i][j]>maxsecond)
{
maxsecond=a[i][j];
}
}
}
cout<<"\nMax: "<<max;
cout<<"\nSecond Max: "<<maxsecond;
return 0;
}
答案 2 :(得分:0)
在此代码块中,如果您观察到,该代码块用于输入2D数组
for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { cin >> a[i][j]; } }
您仅分别输入位置1到n-1和m-1的元素。
因此,如果您输入的是2 3
然后
a[1][1] ->> 4
a[1][2] ->> 8
由于条件变为假,输入将停止。 然后,在其余的代码之后执行相同的代码,结果分别为8和4;
在C ++数组中,格式从0
到n-1
。假设数组arr [5],我们可以访问a [0],a [1],a [2],a [3],a [4]。
因此,我们编写循环以将数组迭代为
for ( int i = 0; i < arr_size; i++ )
请找到更正的解决方案以供参考。
#include <iostream>
#include <limits>
int main()
{
int arr[10][10];
int size1 = 0, size2 = 0;
std::cin >> size1 >> size2;
for (size_t i = 0; i < size1; i++)
{
for (size_t j = 0; j < size2; j++)
{
std::cin >> arr[i][j];
}
}
int max, secondMax;
max = secondMax = std::numeric_limits<int>::min();
for (size_t i = 0; i < size1; i++)
{
for (size_t j = 0; j < size2; j++)
{
if (arr[i][j] > max)
{
secondMax = max;
max = arr[i][j];
}
else if (arr[i][j] > secondMax)
{
secondMax = arr[i][j];
}
}
}
std::cout << max << " " << secondMax << std::endl;
return 0;
}