C-程序以查找阵列中的最大和第二大数字



我已经搜索了许多网站来找到这个问题。他们正在通过某种不同的方法进行。如果我将数组的第一个元素输入最大,即a[0],则此代码只是不会给出输出。我认为需要一些小的更改。有人可以告诉我吗?

#include <stdio.h>
int main() {
    int a[10], n;
    int largest1, largest2, i;
    printf("enter number of elements you want in array");
    scanf("%d", &n);
    printf("enter elements");
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    largest1 = a[0];
    for (i = 0; i < n; i++) {
        if (a[i] > largest1) {
            largest1 = a[i];
        }
    }
    largest2 = a[0];
    for (i = 1; i < n; i++) {
        if (a[i] > largest2 && a[i] < largest1)
            largest2 = a[i];
    }
    printf("First and second largest number is %d and %d ", largest1, largest2);
}

我将忽略处理输入,这只是一个干扰。

简单的方法是对其进行排序。

#include <stdlib.h>
#include <stdio.h>
int cmp_int( const void *a, const void *b ) {
    return *(int*)a - *(int*)b;
}
int main() {
    int a[] = { 1, 5, 3, 2, 0, 5, 7, 6 };
    const int n = sizeof(a) / sizeof(a[0]);
    qsort(a, n, sizeof(a[0]), cmp_int);
    printf("%d %dn", a[n-1], a[n-2]);
}

,但这不是最有效的,因为它是O(n log n),这意味着随着数组的增加,比较数量更大。不太快,比指数慢,但是我们可以做得更好。

我们可以在O(n)或"线性时间"中进行,这意味着随着数组的比较数量增长,以相同的速率增长。

循环穿过数组跟踪最大值,这是找到最大值的通常方法。当您找到新的最大值时,旧的最大将成为第二高的数字。

而不是让第二个循环找到第二高的数字,而是在特殊情况下以进入第二高的数字。

#include <stdio.h>
#include <limits.h>
int main() {
    int a[] = { 1, 5, 3, 2, 0, 5, 7, 6 };
    // This trick to get the size of an array only works on stack allocated arrays.
    const int n = sizeof(a) / sizeof(a[0]);
    // Initialize them to the smallest possible integer.
    // This avoids having to special case the first elements.
    int max = INT_MIN;
    int second_max = INT_MIN;
    for( int i = 0; i < n; i++ ) {
        // Is it the max?
        if( a[i] > max ) {
            // Make the old max the new 2nd max.
            second_max = max;
            // This is the new max.
            max = a[i];
        }
        // It's not the max, is it the 2nd max?
        else if( a[i] > second_max ) {
            second_max = a[i];
        }
    }
    printf("max: %d, second_max: %dn", max, second_max);
}

可能有一种更优雅的方法来做到这一点,但最多可以进行2n比较。充其量会做n。

请注意,有一个关于如何处理{ 1, 2, 3, 3 }的问题。那应该返回3, 3还是2, 3?我将把它留给您以做出相应的决定。

您的代码问题是逻辑问题(这是最多的编码)。如果最大的数字是第一个,那么它会遇到第二大数字错误...为什么?

好吧,请查看您的逻辑,以决定第二大数字。您首先将其设置为等于数组中的第一个元素最大数字!)。

要解决它,您可以特殊情况:检查第一个数字是否是第一个,如果是的,则将其设置为第二个元素(然后是特殊情况,有人要求某人在一个元素中找到最高的两个元素数组,没有阅读阵列的末尾。)

我认为Chqrlie答案中给出的方法是最好的。也合乎逻辑:编写一个程序以找到最大的数字。第二大数字,那只是以前最大的!

您需要更好地保留数组成员的索引,因为它们是唯一的这是一个工作代码,有几个更改:

#include<stdio.h>
int main()
{
    int a[10],n;
    int largest1,largest2,i;
    printf("enter number of elements you want in array");
    scanf("%d",&n);
    printf("enter elements");
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    largest1=0;
    for(i=0;i<n;i++)
    {
        if(a[i]>a[largest1])
        {
            largest1=i;
        }
    }
    if(largest1!=0) // this condition to select another index than the largest
        largest2=0;
    else
        largest2=n-1;
    for(i=0;i<n && i != largest1 ;i++)
    {
        if(a[i]>a[largest2])
            largest2=i;
    }
    printf("First and second largest number is %d and %d ",a[largest1],a[largest2]);
}

请注意,当数组的尺寸为1值时。您是否应该找到两个最大的不同值或两个最大的可能相同值?

您的代码似乎表示您想要第一种方法,但是如果最大的值是a[0],则有问题。您应该使用额外的布尔来跟踪您是否发现了其他价值。

您还应该测试不同scanf()调用的返回值,然后从main()返回0。

这是一个修改版本:

#include <stdio.h>
int main(void) {
    int a[10], n, i;
    int largest1, largest2, has_largest2;
    printf("enter number of elements you want in array: ");
    if (scanf("%d", &n) != 1)
        return 1;
    if (n < 2) {
        printf("need at least 2 elementsn");
        return 1;
    }
    printf("enter elements: ");
    for (i = 0; i < n; i++) {
        if (scanf("%d", &a[i]) != 1) {
            printf("input errorn");
            return 1;
        }
    }
    largest1 = a[0];
    for (i = 1; i < n; i++) {
        if (a[i] > largest1) {
            largest1 = a[i];
        }
    }
    has_largest2 = largest2 = 0;
    for (i = 0; i < n; i++) {
        if (a[i] < largest1) {
            if (!has_largest2) {
                has_largest2 = 1;
                largest2 = a[i];
            } else
            if (a[i] > largest2) {
                largest2 = a[i];
            }
        }
    }
    if (has_largest2) {
        printf("First and second largest number is %d and %dn",
               largest1, largest2);
    } else {
        printf("All values are identical to %dn", largest1);
    }
    return 0;
}

您可以在一次通过中做得最好。

最大和最大2设置为INT_MIN进入时。然后逐步跨越数组。如果最大的数字小于数字,则最大的2变为最大,最大的是新数字(或者如果要允许重复)。如果最大的数字更大,则新数量,请测试最大2。

请注意,此算法会缩放到在数组中找到前三或四个,然后再变得太麻烦了,最好排序。

//我认为它很简单

#include<stdio.h>
int main()
{
int a1[100],a2[100],i,t,l1,l2,n;
printf("Enter the number of elements:n");
scanf("%d",&n);
printf("Enter the elements:n");
for(i=0;i<n;i++)
{
    scanf("%d",&a1[i]);
}
l1=a1[0];
for(i=0;i<n;i++)
{
    if(a1[i]>=l1)
    {
        l1=a1[i];
        t=i;
    }
}
for(i=0;i<(n-1);i++)
{
    if(i==t)
    {
        continue;
    }
    else
    {
        a2[i]=a1[i];
    }
}
l2=a2[0];
for(i=1;i<(n-1);i++)
{
    if(a2[i]>=l2 && a2[i]<l1)
    {
        l2=a2[i];
    }
}
printf("Second highest number is %d",l2);
return 0;
}

无需使用第三个循环来检查数组中的第二大数字。您只能使用两个循环(一个用于插入,另一个用于检查。

请参阅此代码。

#include <stdio.h>
int main()
{
int a[10], n;
int i;
printf("enter number of elements you want in array");
scanf("%d", &n);
printf("enter elements");
for (i = 0; i < n; i++) {
    scanf("%d", &a[i]);
}
int largest1 = a[0],largest2 = a[0];
for (i = 0; i < n; i++) 
{
    if (a[i] > largest1) 
    {
         largest2=largest1;
         largest1 = a[i];
    }
}
printf("First and second largest number is %d and %d ", largest1, largest2);
}

希望此代码对您有用。

享受编码:)

在不使用任何字符串函数的情况下找到第二大数字:

int array[];//Input array
int firstLargest, secondLargest;
int minNumber = -1;//whatever smallest you want to add here
/*There should be more than two elements*/
if (array_size < 2)
{
    printf("Array is too small");
    return;
}
firstLargest = secondLargest = minNumber;
for (index = 0; index < array_size ; ++index)
{
    //Largest number check
    if (array[index] > first)
    {
        secondLargest = firstLargest;
        firstLargest = array[index];
    }
    //It may not larger than first but can be larger than second number
    else if (array[index] > secondLargest && array[index] != firstLargest)
{
        secondLargest = array[index];
}
//Finally you got your answer
if (secondLargest == minNumber)
{
    printf("No Second largest number");
}
else
{
    printf("Second Largest Number is %d", secondLargest);
}

这是一个带有单个循环的答案。

int array[] = { 10, 15, 13, 20, 21, 8, 6, 7, 9, 21, 23 };
const int count = sizeof(a) / sizeof(a[0]);
int lastMaxNumber = 0;
int maxNumber = 0;
for (int i = 0; i < count; i++) {
    // Current number
    int num = array[i];
    // Find the minimum and maximum from (num, max)
    int maxValue = (num > maxNumber) ? num : maxNumber;
    int minValue = (num < maxNumber) ? num : maxNumber;
    // If minValue is greater than lastMaxNumber, update the lastMaxNumber
    if minValue > lastMaxNumber {
        lastMaxNumber = minValue;
    }
    // Updating maxNumber
    maxNumber = maxValue;
}
printf("%d", lastMaxNumber);

如果您需要在现有数组中找到最大和第二大元素,请参见上面的答案(Schwern的答案包含我将使用的方法)。

但是;需要在现有阵列中找到最大和第二大元素通常表示设计缺陷。整个阵列不会神奇地出现 - 它们来自某个地方,这意味着最有效的方法是在创建阵列时跟踪"当前最大和当前第二大"。

例如;对于您的原始代码,数据来自用户;通过跟踪"用户输入的最大和第二大值"在循环中获取值的循环内部,跟踪信息的开销将被等待用户按下键/s所花费的时间隐藏,您用户在等待结果时不再需要进行搜索,而您完全不需要数组。

是这样:

int main() {
    int largest1 = 0, largest2 = 0, i, temp;
    printf("enter number of elements you want in array");
    scanf("%d", &n);
    printf("enter elements");
    for (i = 0; i < n; i++) {
        scanf("%d", &temp);
        if(temp >= largest1) {
            largest2 = largest1;
            largest1 = temp;
        } else if(temp > largest2) {
            largest2 = temp;
        }
    }
    printf("First and second largest number is %d and %d ", largest1, largest2);
}

尝试一下:

    firstMax = arr[0];
    for (int i = 0; i<n; i++) {
        if (firstMax < arr[i]  ) {
            secondMax = firstMax;
            firstMax = arr[i];
        }
    }

尽管可以在一次扫描中进行,但是要纠正您自己的代码,但您必须将最大的2声明为int.min。

#include<stdio.h>
int main()
{
    int a[10];
    int i,b,c;
    printf("Enter ten values : n");
    for(i=0; i<10; i++)
    {
        scanf("%d",&a[i]);
    }
    b=a[0];
    for(i=0; i<10; i++)
    {
        if(a[i]>b)
        {
            b=a[i];
        }
        else
        {
            b=b;
        }
    }
    if(b==a[1])
    {
        c=a[2];
    }
    else 
    {
        c=a[1];
    }
    for(i=0; i<10; i++)
    {
        if(a[i]>c && a[i]!=b)
        {
            c=a[i];
        }
        else if (b>c)
        {
            c=c;
        }
    }


    printf("Largest number is %dnSecond largest number is %d",b,c);
}

如果您需要在数组中找到最大或最小的元素种类。Bubble Sort在每次通过时最终转移最大元素的简单概念(如果顺序增加)。由于您需要数组中的第一大元素和第二大元素,因此2个气泡排序可以解决问题。最后一个元素将是最大的,第二个要素将是第二大元素。我为您提供了可以帮助您理解泡沫排序概念的链接。

http://www.codeido.com/2010/10/bubblesort-witritten-in-c-with-example-sample-step-by-step/

希望它有帮助!

最新更新