我想从10个数字(scanf)中找到三个最大的数字(区域),我写了这个代码,但是当我运行它时,只有最大数字是正确的,第二个和第三个最大数字是错误的。所以,我需要帮助。有什么建议?圣诞快乐!
#include <stdio.h>
#define N 3
int main()
{
int i,j;
int area;
int maxArea[N];
int empty = N;
for(j=0;j<10;j=j+1)
{
printf("Input:");
scanf("%d",&area);
printf("\n");
if(empty > 0)
{
maxArea[N-empty]=area;
empty=empty-1;
}
else
{
for(i=0; i < N; i=i+1)
{
if(area>maxArea[i])
{
maxArea[i]=area;
break;
}
}
}
}
printf("Area1=%d\n",maxArea[0]);
printf("Area2=%d\n",maxArea[1]);
printf("Area3=%d\n",maxArea[2]);
}
答案 0 :(得分:1)
首先,您应该将所有数组元素初始化为零。
此外,您的代码无法正常工作,因为您只检查数组中第一个元素是否小于新元素。
如果数组有6,3,2并且新元素是7,那么7将从数组中弹出6并且数组将变为7,3,2。相反它应该是7,6,3。
您应该弹出数组中的最小数字。
在一般情况下,minheap
将是最佳度假胜地。 (对于k个最大的元素)
答案 1 :(得分:1)
我只想向您展示一种不同的方法,您必须自己决定什么更容易;
首先,我使用尽可能小的整数初始化maxArea
。这样,如果它还不包含3个数字,我不需要特殊处理。任何数字都会比MIN_INT
更大,因此会自动替换。
for(i=0; i < N; i++)
{
maxArea[i]=MIN_INT;
}
在循环中,我用旧的最大值交换区域,并且我继续运行循环,因此旧的值将重用于其他最大值。
for(j=0;j<10;j=j+1)
{
printf("Input:");
scanf("%d",&area);
printf("\n");
for(i=0; i < N; i++)
{
if(area>maxArea[i])
{
// swap both
int temp=maxArea[i];
maxArea[i]=area;
area=temp;
}
}
}
请注意,这不是非常优化,但最好还是阅读正在发生的事情。 maxArea[0]
永远是大人物,maxArea[1]
是下一个等等。
例如,如果数组是[6,3,2],并且新区域是5;
答案 2 :(得分:1)
#include <stdio.h>
#include <limits.h>
#include <string.h>
#define N 3
int main(){
int i,j;
int area;
int maxArea[N];
for(i=0;i<N;++i)
maxArea[i]=INT_MIN;
for(j=0;j<10;++j){
printf("Input:");
scanf("%d",&area);
printf("\n");
for(i = 0;i<N && i <= j;++i){
if(area > maxArea[i]){
memmove(&maxArea[i+1], &maxArea[i], (N-i-1)*sizeof(*maxArea));
maxArea[i] = area;
break;
}
}
}
printf("Area1=%d\n", maxArea[0]);
printf("Area2=%d\n", maxArea[1]);
printf("Area3=%d\n", maxArea[2]);
return 0;
}