Deuxième plus grand [QCM 2002]

Bonjours !

Je me suis attelé à la réalisation de l'un des exercices du QCM 2002 : Deuxième plus grand.

Mais il se trouve que je n'ai pas très bien compris l'énoncé ( c'est une chose que reproche d’ailleurs à la plupart de vos énoncés ) : les entiers positifs sont-ils compris entre 0 et 9 ou est-ce des nombres à plusieurs chiffres ?

Merci !

Un entier positif c'est un nombre entier qui est supérieur ou égal à 0, donc ca peut très bien être 1587 (cela dit je ne suis pas sûr que ce soit une information cruciale pour résoudre le problème...). Je suis pas sûr qu'on puisse dire que l'énoncé est mal formulé. Si il fallait commencer à expliquer ce qu'est un nombre entier à chaque problème, on aurait pas fini...

Oui j'imagine bien... Mais comme l'exemple tendait à démontrer le contraire ( que des nombres à un seul chiffre ) le doute était permis.

En tout cas merci pour la précision.

EDIT : pour moi c'est une information cruciale, je travail en C++ et en C++ convertir une suite de caractères chiffrés en nombre est assez long et couteux.

Je sais pas comment tu lis ton entrée en C++ mais normalement c'est pas compliqué du tout de lire des nombres à plusieurs chiffres, un simple std::cin ou scanf suffit.

+1 pour auguste
Je suis un peu en mode WTF après avoir lu le message d'@algorythme... Qu'entends-tu par là? Tu t'amuses quand même pas à utiliser du stringstream ou bien de la conversion caractère par caractère? Et même comme ça, c'est pas un nombre à 8 chiffres au maximum qui va t'inquiéter, si?

Bon après, c'est vrai qu'ils ont manqué de rigueur, vu qu'ils n'ont pas mis les contraintes pour les entiers de la liste, donc on peut se demander si un simple int suffit ou s'il faut plutôt opter pour des long long.

Edit: Ah oui, c'est bon, effectivement, cin et cout sont trop lents pour cet exo, faut que tu passes par des scanf et des printf

En fait c'est comme quand tu lis dans un fichier (sauf qu'il faut pas faire des fscanf hein). Pour aller récupérer les données, il te suffit de faire une boucle et de mettre des scanf("%d", &entier[i]); il va chercher les entiers un par un dans l'entrée...

"L'entrée standard contient deux lignes : ". L’énoncé est clair, il y a deux lignes dans l'entrée donc on ne revient pas à la ligne après chaque nombre. L'entrée suit ton deuxième schéma.
Ce qui ne doit pas te poser de problème normalement, je ne comprends pas pourquoi tu te casses la tête à faire des conversions oO.

Non non c'est pas du tout ce que je voulais dire.

Je sais très bien saisir un entier avec std::cin.

Le problème est qu'il s'agit d'un ensemble de nombre saisis d'un seul coup, et donc de ce fait il faut utiliser un string...

PS : à moins que le serveur de test fasse (1) :

1) Taper le nombre
2) Entrer
3) Pareil pour le suivant

Plutôt que (2) :

1) Taper un nombre
2) Espace
3) Pareil pour le suivant

J'étais persuadé qu'il suivait le (2), ce qui me forçait à utiliser des strings et des conversions chiffres => nombre ce qui est fastidieux.

Vous savez lequel des deux schémas il suit ?

La chose m'arrangerait fortement si c'était le premier et non le deuxième.

Merci beaucoup.

EDIT : il est d’ailleurs marqué, je cite :

" L'entrée standard contient deux lignes :

Le nombre N d'entiers de la suite.
Les entiers de la suite, séparés par des espaces. "

J'attends avec impatience l’explication de tout codeur en C/C++ ou d'un ADMIN pour savoir comment la chose en fonctionne en entrée standard.

EDIT 2 : OMG WTF ???

Excusez moi mais je mérite vraiment de mourir de ma propre stupidité !

En effet je viens juste de comprendre que plusieurs std::cin mis bout à bout permettent d'entrer plusieurs nombre d'un seul coup séparés par des espaces !

Désolé pour ces stupides interventions, moi qui avait la vanité de croire maîtriser le c++ !

Je vous remercie à tous pour votre patience que je ne mérite pas !

Bon, tout est expliqué dans l'EDIT2 de mon message précédent, merci à tous...

Comme quoi ma bêtise n'a d'égale que l'étendue de mon ignorance.*

* Faut que j'la r'ssorte un aut' jour celle là.

Le serveur il fait juste ça en gros :
./toncode Puis il diff avec test01.out

C'est valable partout, et les « exemples » font eux-même partie des tests (souvent les premiers).

@serialk : merci ! ;)

@Hyperman : sympathique comparaison je trouve...

@epsilon : oui en effet, site du zéro.
Je suis d'accord avec tout le monde pour dire qu'ils n'apprennent pas très bien la programmation à leurs lecteurs : à chaque chapitre ils ne donnent que le minimum pour comprendre le chapitre suivant.

Avec eux on n'apprend pas un langage, on n'en a qu'un bref aperçu.

Cependant ils ont au moins le mérite ( et ça on ne peut le nier ) qu'ils rendent la programmation accessible à l'individu lambda.

Pour le non-initié ( celui qui ne compte aucun parent informaticien donc... ) c'est le seul moyen d'apprendre la programmation ( surtout quand le non initié en question est en seconde et que le défi algorithmique le plus palpitant que lui ait jamais proposé ses profs est de créer un programme de calcul du minimum sur CASIO...).

Grâce à eux je comprend les bouquins de fac sur un langage ou un autre ( majoritairement le C++ dans mon cas ), des livres qui seraient restés inaccessible à moi sinon.

En revanche je n'ai vu nul part qu'on pouvait entrer plusieurs nombres à la suite.

Comme quoi les bidouillages improbables avec son compilateur sont les seuls moyens de progresser.

PS : je vois que tu as précisé " /me en mode troll ", développe donc tes arguments ! :)

Au moins il a le mérite d'admettre qu'il a été stupide...
Veux-tu bien utiliser les éditions uniquement pour corriger des fautes d'orthographe où modifier ton message s'il est le dernier d'une discussion?, car là ça ressemble fortement à un goto fort peu esthétique.

Le problème n'a jamais été de commencer sur le site du zéro, surtout quand on y connaît rien, leur visibilité les rend quasi incontournables. Il faut juste arriver à se rendre compte que dans la plupart de leurs cours le niveau est insuffisant. C'est d'autant plus grave quand on voit des gens qui se targuent de maîtriser le C dans leurs signatures parce qu'ils ont fini la lecture d'un cours.

Donc quand on voit des choses comme :
C/C++ : [||||||||] 100%

On a souvent des envies de meurtre.

Et puis au bout d'un moment passé sur le site, tu te rends compte qu'une grande majorité des membres a un problème d'autonomie et de maturité assez honteux¹ (sans généraliser), malgré certains sujets parfois captivants, qui restent très minoritaires. C'est d'ailleurs pour ça que la plupart des gens ayant acquis des connaissances plus amples cherchent à se rapprocher des autres dans le même cas.

¹ Ouvrez un sujet dans le forum "Web" au hasard par exemple.

Je débute encore suffisamment dans le domaine pour ne pas pouvoir me passer de leur aide ( d'autant que la communauté est très fournie et que certains membres comme tu le dis bien sont assez calés dans le domaine ) : pour s'initier à une bibliothèque ils restent les meilleurs faute de tutoriels simples sur le net.

Après je dois bien reconnaître que voir quelqu'un marquer :

C/C++ : [||||||||||] 100%

et demander qu'on lui explique comment faire un MMORPG 3D temps réel, eh bien alors là oui l'envie de meurtre est justifiée.

D'ailleurs, fort à propos, sur quels sites puis-je espérer trouver des gens plus calés ? ( il y a bien Développez.com mais il me semble que c'est à peine moins sale que le SdZ )

* Je regarde dans la section web vu que j'y vais jamais.

Tu as le merveilleux forum de Prologin.

Tu peux aussi aller sur France-IOI, où on t'apprend pas mal de choses sur l'algorithmique.

@²lgorythme : À vrai dire, c'était une préparation, mais ça va tu as l'air de bien comprendre la situation, donc il n'y a pas à troller, juste à observer et à se lamenter ensemble de ce que Serialk appelle « leur visibilité ». :'(
Et bien que développez ne soit pas parfait et que la motivation « j ve codé WoW, mé en plu b1 » ne suffise pas pour suivre leurs cours, c'est quand même bien mieux que le site du zéro.

Sinon, pour la lecture d'un vector, il n'y a nullement besoin de plusieurs >> :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <vector>
    
    int main(){
        unsigned n;
        std::cin >> n;
        std::vector<unsigned> v;
        v.reserve(n);
        std::copy(std::istream_iterator<unsigned>(std::cin), std::istream_iterator<unsigned>(), std::back_inserter(v));
        // Ton code ici.
    }

C'est possible de rendre ça encore plus C++ifié, mais bon, c'est toujours mieux que le for(int i=0;…

Merci pour précision, c'est à justement à coup de :

1
for (unsigned int i=0; itaille; ++i) std::cin >> i;

que je procédais !

D’ailleurs la procédure est assez lente vu que que le serveur me renvoie sans cesse que mon programme est trop long alors qu'il utilise une boucle de parcourt unique et optimisé pour résoudre l'exercice.

L'emploi d'un vector est-elle plus rapide ou alors faut-il passer par le scanf de la bibliothèque C ?

Répondre au sujet

Vous devez vous enregistrer ou vous connecter pour poster des messages.