找到第二大数字

时间:2016-09-24 06:00:06

标签: c math

是的,有很多人已经讨论过这个问题,但这个问题似乎有些不同寻常。程序应该找到用户输入的五个中的第二大数字。我们既不能使用loops也不能使用if语句。也不能使用arraysgoto's,但可以使用三元运算符。 I / 0的样本:

输入:34 -52 87 -12 20输出:34

输入:-87 52 87 87 20输出:87

如您所见,用户可以输入两个相同的数字,程序应该能够以这种方式对待它。这是C编程。

#include <stdio.h>
#include <stdlib.h>


int main(void)
{

    int i1, i2, i3, i4, i5;
    int max, second_max;

    scanf("%d %d %d %d %d", &i1, &i2, &i3, &i4, &i5);

    max = i1;
    max = (i2 > max) ? i2 : max;
    max = (i3 > max) ? i3 : max;
    max = (i4 > max) ? i4 : max;
    max = (i5 > max) ? i5 : max;

    second_max = i1;
    second_max = (i1 > second_max && i1 < max) ? i1 : second_max;
    second_max = (i2 > second_max && i2 < max) ? i2 : second_max;
    second_max = (i3 > second_max && i3 < max) ? i3 : second_max;
    second_max = (i4 > second_max && i4 < max) ? i4 : second_max;
    second_max = (i5 > second_max && i5 < max) ? i5 : second_max;




    printf("\nmax: %d", max);
    printf("\nsecond_max : %d", second_max);




    return 0;
}

在这里,我可以找到所有内容,当涉及第二个输出样本时,它会失败。我有编程经验,但从早上起就无法解决这个问题

2 个答案:

答案 0 :(得分:2)

显然,如果您可以对数字进行排序,问题很容易解决。那么如何仅使用三元运算符对数字进行排序?答案称为sorting network

这是代码的样子:

#include <stdio.h>

void swap( int *a, int *b )
{
    int x = *a <= *b ? *a : *b;
    int y = *a <= *b ? *b : *a;
    *a = x;
    *b = y;
}

int main( void )
{
    int a = 1, b = 9, c = 3, d = 8, e = 3;

    swap( &a, &b );
    swap( &c, &d );
    swap( &b, &e );
    swap( &a, &b );
    swap( &d, &e );
    swap( &a, &c );
    swap( &c, &d );
    swap( &b, &c );
    swap( &c, &d );

    printf( "%d %d %d %d %d\n", a,b,c,d,e );
}

对数字进行排序后,第二大数字为d

请注意,如果您不能使用子程序和/或指针,则只需复制swap函数的正文并将其粘贴到main九次。然后根据需要更改字母。玩得开心。

答案 1 :(得分:0)

初始化两个变量:最高和第二高度INT_MIN

为所有元素执行以下操作:

Secondhighest = max(a [i],secondhighest)

最高&lt;第二高?交换它们:do_nothing

TC:O(N)