web-dev-qa-db-fra.com

Programme pour trouver le plus grand et le deuxième plus grand nombre dans la matrice

J'ai cherché de nombreux sites Web pour cette question. Ils le font par une approche différente . Ce code ne donne tout simplement pas de sortie si je saisis le premier élément du tableau le plus grand, à savoir 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);
}
2
Bhart Kumar

( Je vais ignorer les informations de manipulation, c'est juste une distraction. )

Le moyen le plus simple est de le trier.

#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 %d\n", a[n-1], a[n-2]);
}

Mais ce n'est pas le plus efficace, car c'est O(n log n), ce qui signifie que plus le tableau est grand, plus le nombre de comparaisons augmente rapidement. Pas trop vite, plus lent que l’exponentielle, mais on peut faire mieux.

Nous pouvons le faire avec O(n) ou "heure linéaire", ce qui signifie que plus le tableau est grand, plus le nombre de comparaisons augmente au même rythme.

Parcourez le tableau en suivant le maximum, c'est le moyen habituel de trouver le maximum. Lorsque vous trouvez un nouveau max, l'ancien max devient le deuxième plus grand nombre.

Au lieu d’avoir une deuxième boucle pour trouver le deuxième numéro le plus élevé, imaginez un cas spécial pour rencontrer le deuxième nombre le plus élevé.

#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: %d\n", max, second_max);
}

Il y a peut-être une façon plus élégante de le faire, mais cela fera, tout au plus, deux comparaisons. Au mieux ça va faire n.

Notez qu'il y a une question ouverte que faire avec { 1, 2, 3, 3 }. Est-ce que cela devrait renvoyer 3, 3 ou 2, 3? Je vous laisse le soin de décider et de vous ajuster en conséquence.

5
Schwern

Si vous avez besoin de trouver le plus grand et le deuxième plus grand élément d'un tableau existant, voir les réponses ci-dessus (la réponse de Schwern contient l'approche que j'aurais utilisée).

Toutefois; le besoin de trouver le plus grand et le deuxième plus grand élément d'un tableau existant indique généralement un défaut de conception. Des tableaux entiers n'apparaissent pas comme par magie - ils viennent de quelque part, ce qui signifie que l'approche la plus efficace consiste à garder trace du "plus grand et du deuxième plus grand en cours" pendant la création du tableau.

Par exemple; pour votre code d'origine, les données proviennent de l'utilisateur; et en gardant une trace de la "plus grande et de la deuxième plus grande valeur que l'utilisateur a entrées" à l'intérieur de la boucle qui obtient des valeurs de l'utilisateur, le temps système nécessaire au suivi des informations sera masqué par le temps passé à attendre que l'utilisateur appuie sur la touche/s. plus besoin de faire une recherche après que l'utilisateur attend les résultats, et vous n'avez plus du tout besoin d'un tableau.

Ce serait comme ça:

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);
}
1
Brendan

La question est ambiguë: si le tableau peut contenir des valeurs en double, êtes-vous censé trouver les 2 plus grandes valeurs distinctes ou les deux plus grandes valeurs éventuellement identiques?

Votre code semble indiquer que vous souhaitez utiliser la première approche, mais vous avez un problème si la plus grande valeur est a[0]. Vous devez utiliser un booléen supplémentaire pour savoir si vous avez trouvé une valeur différente pour le moment.

Vous devez également tester la valeur de retour des différents appels scanf() et renvoyer 0 à partir de main().

Voici une version modifiée:

#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 elements\n");
        return 1;
    }
    printf("enter elements: ");
    for (i = 0; i < n; i++) {
        if (scanf("%d", &a[i]) != 1) {
            printf("input error\n");
            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 %d\n",
               largest1, largest2);
    } else {
        printf("All values are identical to %d\n", largest1);
    }
    return 0;
}
0
chqrlie

Il n'est pas nécessaire d'utiliser la troisième boucle pour vérifier le deuxième plus grand nombre du tableau. Vous ne pouvez utiliser que deux boucles (une pour l'insertion et l'autre pour la vérification.

Référez-vous ce code.

#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);
}

J'espère que ce code fonctionnera pour vous.

Profitez de la programmation :)

0
Nitish Gupta

Trouvez votre deuxième plus grand nombre sans utiliser aucune fonction String:

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);
}
0
Sarat Patel

Essayez avec ceci:

    firstMax = arr[0];

    for (int i = 0; i<n; i++) {

        if (firstMax < arr[i]  ) {
            secondMax = firstMax;
            firstMax = arr[i];
        }
    }
0
Shourob Datta

Essaye ça:

public static void main(String[] args) throws IndexOutOfBoundsException {

    int[] a = { 12, 19, 10, 3, 9, 8 };
    int n = a.length;
    int larg = a[0];
    int larg2 = a[0];

    for (int i = 0; i < n; i++) {
        if (larg < a[i]) {
            larg = a[i];

        }
        if (a[i] > larg2 && larg < a[i]) {
            larg2 = a[i];

        }
    }

    System.out.println("largest " + larg);
    System.out.println("largest2 " + larg2);

}
0
Viraj Giri

Le problème de votre code est un problème de logique (qui est l’essentiel du codage). Si le plus grand nombre est le premier, alors le deuxième plus grand nombre se trompe ... pourquoi?

Eh bien, regardez votre logique pour décider du deuxième plus grand nombre. Vous le définissez d’abord comme égal au premier élément du tableau, puis vous parcourez le tableau et modifiez l’index si l’élément est supérieur au deuxième plus grand nombre actuel (ce qui ne sera jamais vrai parce que nous l’avons déjà défini le plus grand nombre!).

Pour le résoudre, vous pouvez utiliser le cas spécial suivant: vérifiez si le nombre le plus élevé est le premier et, le cas échéant, définissez-le sur le deuxième élément (puis sur le cas spécial, le problème de quelqu'un lire au-delà de la fin d'un tableau.)

Je pense que la méthode donnée dans la réponse de chqrlie pour faire tout cela en un seul passage est la meilleure. Et logique aussi: écrivez un programme pour trouver le plus grand nombre. Deuxième plus grand nombre, eh bien c'est juste celui qui était auparavant le plus grand!

0
dave

// Je pense que c'est simple comme

#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;
}
0

Vous devez mieux conserver l’index des membres du tableau car ils sont unique Voici un code fonctionnel avec peu de modifications:

#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]);
}

Notez que lorsque le tableau est de taille 1, les valeurs seront les mêmes.

Voici une réponse avec une seule boucle for.

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);
0
TheTiger

Vous pouvez le faire mieux en un seul passage.

le plus grand et le plus grand2 sont définis sur INT_MIN à l'entrée ..__, puis parcourez le tableau. Si le plus grand est inférieur au nombre, le plus grand2 devient le plus grand, puis le plus grand devient le nouveau nombre (ou plus petit ou égal si vous souhaitez autoriser les doublons). Si le plus grand est supérieur au nouveau nombre, test le plus grand2.

Notez que cet algorithme permet de trouver les trois ou quatre premiers d'un tableau, avant qu'il ne devienne trop encombrant et qu'il soit préférable de trier.

0
Malcolm McLean
package secondhighestno;

import Java.util.Scanner;

/**
 *
 * @author Laxman
 */
public class SecondHighestno {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner sc=new Scanner(System.in);
        int n =sc.nextInt();
        int a[]=new int[n];
        for(int i=0;i<n;i++){
            a[i]=sc.nextInt();
        }
        int max1=a[0],max2=a[0];
        for(int j=0;j<n;j++){
            if(a[j]>max1){
                max1=a[j];
            }
        }
        for(int k=0;k<n;k++){
            if(a[k]>max2 && max1>a[k]){
                max2=a[k];
            }
        }
        System.out.println(max1+" "+max2);
    }
}
0
lucky