查找数组中的最小偶数和最大偶数
Find the Min Even Integer and Max Even Integer in an Array
int i,max,min;
int A[11];
min = A[1];
max = A[1];
for(i=1;i<=10;i++)
{
if(min > A[i] && A[i]%2 ==0 ) min = A[i];
if(max < A[i] && A[i]%2 ==0 ) max = A[i];
}
printf("Minimum Even : %d\n",min);
printf("Maximum Even : %d\n",max);
getch();
}
当我用 1、2、3、4、5、6、7、8、9、10 填充数组时
为什么最小偶数等于1?
min = A[1];
这里 min 已经初始化为 1。所以,
if(min > A[i] && A[i]%2 ==0 ) min = A[i];
条件永远不会为真。
添加头文件limits.h
并初始化
min=INT_MAX;
max=INT_MIN;
此测试用例暴露了代码的阴暗面之一,您已将 min
和 max
初始化为 A[1]
,而不管 A[1]
是奇数还是甚至。
问题:
可能存在数组不包含任何偶数的情况。在这种情况下,您可能希望打印 so 而不是打印 -1
或 INT_MIN
或 INT_MAX
.
如果您是 INT_MIN
和 INT_MAX
的新手,this 将在继续解决方案之前充当入门者。
解法:
此解决方案修改您的代码,使其能够处理所有情况,前提是您提供的输入没有任何错误。
有一个 flag 知道你是否找到了你的 min
和 max
:
int foundAnswer = 0;
添加头文件limits.h
并初始化你的min
和max
为
如下:
min = INT_MAX;
max = INT_MIN;
修改您的循环,使标志发挥作用:
注:
不要无缘无故地浪费数组的第零个索引。
之前相应地修改数组声明和输入循环
改这个。
for (i = 0; i < ARRAY_SIZE; ++i)
{
if (A[i] % 2 == 0)
{
foundAnswer = 1;
if (A[i] < min) min = A[i];
if (A[i] > max) max = A[i];
}
}
稍微修改您的打印代码,使所有情况都
覆盖。
if (foundAnswer)
{
// Print min
// Print max
}
else
{
// Print "min and max not found"
}
奖金:
您可以从以下链接中学习以优化您的代码:
How do I check if an integer is even or odd using bitwise operators
讨论的算法 here 将为您提供更好的时间复杂度来实现相同的目标。
问题是您将 min
和 max
初始化为一个可能不偶数的值。
以下是处理空数组、仅包含奇数的数组和仅包含INT_MAX
的数组的有效解决方案:
int A[] = {1,2,3,4,5,6,7,8,9,10};
size_t n = 10;
size_t found_even = 0;
int min, max;
while (n--) {
int val = A[n];
if ((A[n] & 1) == 0) { // Assumes a 2's complement machine.
if (found_even++) {
if (A[n] < min) min = A[n];
else if (A[n] > max) max = A[n];
} else {
min = val;
max = val;
}
}
}
if (found_even) {
printf("Minimum even: %d\n", min);
printf("Maximum even: %d\n", max);
} else {
printf("Minimum even: <none>\n");
printf("Maximum even: <none>\n");
}
稍微快一点:
int A[] = {1,2,3,4,5,6,7,8,9,10};
size_t n = 10;
int found_even = 0;
int min, max;
while (n--) {
int val = A[n];
if ((A[n] & 1) == 0) { // Assumes a 2's complement machine.
min = val;
max = val;
found_even = 1;
break;
}
}
if (found_even) {
while (n--) {
if ((A[n] & 1) == 0) {
if (A[n] < min) min = A[n];
else if (A[n] > max) max = A[n];
}
}
printf("Minimum even: %d\n", min);
printf("Maximum even: %d\n", max);
} else {
printf("Minimum even: <none>\n");
printf("Maximum even: <none>\n");
}
int i,max,min;
int A[11];
min = A[1];
max = A[1];
for(i=1;i<=10;i++)
{
if(min > A[i] && A[i]%2 ==0 ) min = A[i];
if(max < A[i] && A[i]%2 ==0 ) max = A[i];
}
printf("Minimum Even : %d\n",min);
printf("Maximum Even : %d\n",max);
getch();
}
当我用 1、2、3、4、5、6、7、8、9、10 填充数组时
为什么最小偶数等于1?
min = A[1];
这里 min 已经初始化为 1。所以,
if(min > A[i] && A[i]%2 ==0 ) min = A[i];
条件永远不会为真。
添加头文件limits.h
并初始化
min=INT_MAX;
max=INT_MIN;
此测试用例暴露了代码的阴暗面之一,您已将 min
和 max
初始化为 A[1]
,而不管 A[1]
是奇数还是甚至。
问题:
可能存在数组不包含任何偶数的情况。在这种情况下,您可能希望打印 so 而不是打印 -1
或 INT_MIN
或 INT_MAX
.
如果您是 INT_MIN
和 INT_MAX
的新手,this 将在继续解决方案之前充当入门者。
解法:
此解决方案修改您的代码,使其能够处理所有情况,前提是您提供的输入没有任何错误。
有一个 flag 知道你是否找到了你的
min
和max
:int foundAnswer = 0;
添加头文件
limits.h
并初始化你的min
和max
为 如下:min = INT_MAX; max = INT_MIN;
修改您的循环,使标志发挥作用:
注:
不要无缘无故地浪费数组的第零个索引。 之前相应地修改数组声明和输入循环 改这个。
for (i = 0; i < ARRAY_SIZE; ++i) { if (A[i] % 2 == 0) { foundAnswer = 1; if (A[i] < min) min = A[i]; if (A[i] > max) max = A[i]; } }
稍微修改您的打印代码,使所有情况都 覆盖。
if (foundAnswer) { // Print min // Print max } else { // Print "min and max not found" }
奖金:
您可以从以下链接中学习以优化您的代码:
How do I check if an integer is even or odd using bitwise operators
讨论的算法 here 将为您提供更好的时间复杂度来实现相同的目标。
问题是您将 min
和 max
初始化为一个可能不偶数的值。
以下是处理空数组、仅包含奇数的数组和仅包含INT_MAX
的数组的有效解决方案:
int A[] = {1,2,3,4,5,6,7,8,9,10};
size_t n = 10;
size_t found_even = 0;
int min, max;
while (n--) {
int val = A[n];
if ((A[n] & 1) == 0) { // Assumes a 2's complement machine.
if (found_even++) {
if (A[n] < min) min = A[n];
else if (A[n] > max) max = A[n];
} else {
min = val;
max = val;
}
}
}
if (found_even) {
printf("Minimum even: %d\n", min);
printf("Maximum even: %d\n", max);
} else {
printf("Minimum even: <none>\n");
printf("Maximum even: <none>\n");
}
稍微快一点:
int A[] = {1,2,3,4,5,6,7,8,9,10};
size_t n = 10;
int found_even = 0;
int min, max;
while (n--) {
int val = A[n];
if ((A[n] & 1) == 0) { // Assumes a 2's complement machine.
min = val;
max = val;
found_even = 1;
break;
}
}
if (found_even) {
while (n--) {
if ((A[n] & 1) == 0) {
if (A[n] < min) min = A[n];
else if (A[n] > max) max = A[n];
}
}
printf("Minimum even: %d\n", min);
printf("Maximum even: %d\n", max);
} else {
printf("Minimum even: <none>\n");
printf("Maximum even: <none>\n");
}