任务:
给定自然数N(任意设置为预处理器常量)和整数的一维数组A0,A1,...,AN-1(使用<stdlib.h>
库函数rand()
随机生成正负元素),执行以下操作:确定该数组的三个最大值和两个最小值。
搜索两个最小值的代码:
#include <stdio.h>
#include <stdlib.h>
#define N 9
int main() {
int M[N], i, a[N], fbig, sbig, tbig, min, smin;
for (i = 0; i < N; i++) {
M[i] = rand() % 20 - 10;
printf("%i\t", M[i]);
}
printf("\n");
for (i = 0; i < N; i++) {
if (a[i] < min) {
smin = min;
min = a[i];
} else
if (a[i] < smin && a[i] != min)
smin = a[1];
}
printf("\nMinimum=%d \nSecond Minimum=%d", min, smin);
return 0;
}
我试着比较数组元素,但结果如下:
-7 -4 7 5 3 5 -4 2 -1
Minimum=0
Second Minimum=0
如果你能帮我修正我的代码,我将非常感激,或者也许我做的每件事都错了,而你知道如何做正确的。
3条答案
按热度按时间hof1towb1#
如果op解决了如何处理重复值,我将修改我的答案。我的答案假设您希望在最小和最大数组中有可能重复的值,而其他答案假设您希望有唯一的值。
最简单的解决方案是对输入数组进行排序,最小值是前2个值,最大值是后3个值:
如果你不能使用sort,那么考虑下面的专门构建的算法。使用数组要容易得多(
min
和max
)而不是单个值,并且作为奖励,这允许您轻松更改最小值(MIN_N
)和最大值(MAX_N
)值。首先我们需要初始化min
和max
数组,我使用了输入数组的初始值,我用了一个循环,为了保持不变,min
数组中的数字是我们见过的最小的(a[0]
到a[i-1]
)我们必须使用replace()
* 最大值 *如果新值a[i]
* 小于 *,则返回它们中的(extrema
)。例如,如果数组是min = { 1, 10 }
,我们要查看的值是a[i] = 5
,则必须替换10
,而不是1
。这是示例输出。第一个值是种子,以防你以后必须重现一个运行。后面是输入,最小值和最大值:
如果
MIN_N
或MAX_N
变得很大,比如说,~ 1,000+,那么您需要对min
和max
数组进行排序,并使用二进制搜索来找出在哪里插入a[i]
,或者使用优先级队列(如堆)来代替数组。von4xj4u2#
您的代码中存在多个问题:
min
和smin
未初始化,因此循环中的比较具有未定义的行为,并且代码完全可以工作。您可以将min
初始化为a[0]
,但初始化smin
并不那么简单。smin = a[1];
中有一个打字错误,您可能是指smin = a[i];
请注意,该赋值有些不明确:最大值和最小值应该是不同的值吗,就像文字所暗示的那样,还是应该由您来确定排序数组的最小元素和最大元素?
以下是打印最小和最大值的修改版本:
yqkkidmi3#
如前所述,最直接的方法就是对数组进行排序(事实上,如果你只需要输出5个整数,那么你的数组只需要5个元素),但我认为这不是本家庭作业的重点。
你的目标不是超级高的效率或漂亮的算法,而是简单地解决问题,一次解决一个问题。
答:循环遍历数组,跟踪到目前为止找到的最大元素。
答案:几乎一样,只有一个简单的变化:我们不测试
(array[n] > largest)
是否成立,而是测试(array[n] < smallest)
是否成立,对吗?答:你不应该感到惊讶,你只需要再次改变循环中的
if
条件。一个元素将是 * 第二小的 *,如果:smallest
的最小值。想一想你会如何改变你的状况:
请记住,这次您要测试 * 两个 * 东西,因此您的测试条件中需要
&&
。此时,您应该能够看到主题的变化,并能够编写一个循环,该循环将获得任何第N个最大值或最小值,只要您已经有了第(N-1)个要处理的值。
进一步考虑:
将所有这些循环放在您的
main()
中,每次都打印出结果,您就大功告成了!输出示例:
额外的好处:小心变量名。从90年代早期开始就没有必要使用简短的缩写。更喜欢清晰而不是简洁。