TD2 Programmation

publicité
TD2 Programmation
Exercice 1 : Nombre secret
Le jeu du nombre secret : l'utilisateur joue
le jeu du nombre secret se joue à deux joueurs. L'un des deux joueurs garde en secret un
nombre que l'autre joueur doit trouver. Ce dernier sait au départ dans quel intervalle se trouve
ce nombre et il peut proposer à chaque tour de jeu un nombre. Si c'est le nombre secret, on lui
indique qu'il a gagné, sinon on lui indique si le nombre proposé est trop petit ou trop grand
par rapport au nombre secret.
Ici, c'est l'ordinateur qui a un nombre secret compris entre 1 et 100 que l'utilisateur doit
trouver.
Exemple (en gras les réponses de l'utilisateur):
Proposer un nombre compris entre 1 et 100
50
trop petit
75
trop grand
64
bravo en 3 coups !
Programmer ce jeu (en attendant de savoir utiliser des générateurs de nombres aléatoires, on
pourra considérer que c'est toujours le même nombre qui est à trouver)
package up5.mi.clelay.td2;
import up5.mi.pary.term.Terminal;
import java.util.Random;
public class NombreSecret {
public static void main(String[] args){
Terminal term = new Terminal("Jeu du nombre sercret",400,400);
utilisateurCherche(term);
ordiCherche(term);
}
public static void utilisateurCherche(Terminal term){
Random gen=new Random();
int nombreSecret=gen.nextInt(100)+1;
int proposition=term.readInt("Proposer un nombre compris entre 1 et 100 : ");
int coups=1;
while(proposition!=nombreSecret){
if(proposition<nombreSecret)
proposition=term.readInt("trop petit : ");
else proposition=term.readInt("trop grand : ");
coups++;
}
term.println("bravo en "+coups+" coups !");
term.end();
}
public static void ordiCherche(Terminal term){
int min=0;
int max=100;
char trouve='<';
int coups=0;
do{
trouve=term.readChar((min+max)/2+" ?");
if(trouve=='<')
min=(min+max)/2;
if(trouve=='>')
max=(min+max)/2;
coups++;
}while(trouve!='=');
term.println("trouvé en "+coups+" coups !");
}
}
Exercice 2 : Nombres premiers
Un nombre entier p divise un nombre entier q si le reste de la division entière de p par q est
zéro.
a. Ecrire une fonction boolenne qui, étant donnés deux entiers strictement positifs p et q, teste
si p divise q.
b. Ecrire une fonction qui, étant donné un entier p, rend le nombre de diviseurs de p.
exemple : 12 à 6 diviseurs : 1,2,3,4,6,12
c.
Un nombre est premier s'il n'est divisible que par 1 et par lui-même.
exemple : 13 est premier , 21 ne l'est pas.
Ecrire la fonction isPremier en utilisant la fonction de b.
d. En fait, si l'on trouve un diviseur pour un nombre p qui est différent de 1 et de p, on peut en
déduire immédiatement que p n'est pas premier.
Ecrire une fonction isPremier utilisant cette propriété.
e. Améliorer en ne considérant comme diviseurs que le nombre 2 et les nombres impairs (en
effet si un nombre n'est pas divisible par 2, il ne sera divisible par aucun nombre pairs !)
f. Améliorer en arrêtant les tests lorsque le diviseur dépasse la racine carrée de n. (en effet, si
un diviseur de p est supérieur à la racine carrée de n, le quotient est donc inférieur à n et aura
été trouvé avant).
g. Ecrire une fonction affichant la liste des n premiers nombres premiers inférieurs à partir de
2..
package up5.mi.clelay.td2;
import java.lang.Math;
import up5.mi.pary.term.Terminal;
public class Exo2 {
public static boolean divise(int p, int q){
return(q%p==0);
}
public static int nombreDeDiviseurs(int n){
int res=2;
for(int i=2;i<n;i++)
if(divise(i,n))
res++;
return res;
}
public static boolean isPremierV1(int n){
return(nombreDeDiviseurs(n)==2);
}
public static boolean isPremierV2(int n){
boolean res=true;
for(int i=2;(i<n)&&res;i++)
res=(n%i!=0);
return res;
}
public static boolean isPremierV3(int n){
boolean res=(n%2!=0);
for(int i=3;(i<n)&&res;i+=2)
res=(n%i!=0);
return res;
}
public static boolean isPremierV4(int n){
if(n==2)
return true;
boolean res=((n%2!=0));
for(int i=3;(i<=Math.sqrt(n))&&res;i+=2)
res=(n%i!=0);
return res;
}
public static void afficheNPremiersNombresPremier(int n,Terminal term){
int i=2;
while(n!=0){
if(isPremierV4(i)){
term.println(i);
n--;
}
i++;
}
}
public static void main(String [] args){
Terminal term=new Terminal("Liste des premiers nombres
premiers",400,400);
afficheNPremiersNombresPremier(term.readInt("Nombre à afficher : "),term);
term.end();
}
}
Téléchargement