IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Calculer la factorielle en java?


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Calculer la factorielle en java?
    slt je suis debutant en java e
    et je veux ecrir une classe en java qui permet calculer le factoriel d un entier . ce nombre est consideré comme !er argument de main(),il est entré par l utilisateur sur la ligne de commande , j ai essayé d ecrir 1 programme mais ca na pas marché .
    voila le programme que je propose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
        public class Factoriel {
     
     
        public static void main(String[] args) {
            int i,a,b;
     
            a=Integer.ParseInt(arg[0]);
            b=a;
                    if (a!=0)
                    {for (i=1;1<b;i++)
                         a=a*i;
                    }
            else
                    a=1;
                    System.out.println("le factde"+arg[0]+"est"+a);
     
     
        }
     
    }
    veuillez m'aidez s'il vous plait a trouver l'erreur
    merci d'avance

  2. #2
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    J'ai légèrement modifié ton code je pense que ça devrais marcher (je n'ai pas la possibilité de tester)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public class Factoriel {
     
     
    public static void main(String[] args) {
    int i,a,b;
     
    a=Integer.ParseInt(arg[0]);
    b=a;
    a=1;
    if (b!=0)
    {for (i=1;i<=b;i++)
    a=a*i;
    }
    System.out.println("le factde"+arg[0]+"est"+a);
    }
    }
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par guigui5931 Voir le message
    J'ai légèrement modifié ton code je pense que ça devrais marcher (je n'ai pas la possibilité de tester)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public class Factoriel {
     
     
    public static void main(String[] args) {
    int i,a,b;
     
    a=Integer.ParseInt(arg[0]);
    b=a;
    a=1;
    if (b!=0)
    {for (i=1;i<=b;i++)
    a=a*i;
    }
    System.out.println("le factde"+arg[0]+"est"+a);
    }
    }
    J'ai vraiment esséyé votre code ,mais ça n'a pas marché
    ....je vois Que le Problème est dans (arg[0]).
    Est ce que quelqu'un pourrait m'expliquer clairement la signification des arguments de main()?

  4. #4
    Membre éclairé Avatar de Tuxico
    Profil pro
    Étudiant
    Inscrit en
    Août 2003
    Messages
    662
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2003
    Messages : 662
    Points : 770
    Points
    770
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class facto {
    	public static void main(String[] args){
    		int a = Integer.parseInt(args[0]);
    		int fact = 1;
    		for(int i = a; i >= 1; i--){
    			fact = fact*i;
    		}
    		System.out.println(fact);
    	}
    }
    voilà

    ton problème est simplement 'arg[0]' c'est 'args[0]'
    ★ Pascal/Java/C/xhtml,css/SQL/Mips
    ★ Linux/unix

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    je pense que le problem est resolu!!!

    on est pas obliger de mettre args pour le nom du tableau de String Mais c'est obligatoire d'avoir une meme syntaxe quand meme.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Mars 2011
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package com.ayoub;
    import java.util.Scanner;
     
    public class operat {
     
    	public static void main (String[]arg){
    		Scanner ad =  new Scanner(System.in);
    		System.out.println(" donne un entier  ");
     
    		int  a = ad.nextInt();
    		//System.out.println("vous avez tapé "+a);
     
    		if (a != 0) {
    		for (int i=a-1 ;i>=1 ;i--){
    			a=a*i;
    		}
     
    		System.out.println("donc le factoriel est =  "+a);
    		} else 
    			a=1;
    			System.out.println("le factoriel est = "+a);
     
     
    	}
    }
    voila la correction ce programme est 100% marché

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1
    Points : 0
    Points
    0
    Par défaut pas juste
    pour les futurs lecteur de ce post,

    les résultats donnés par ces différentes versions ne sont pas bons!

    par ex:

    factoriel 14 = 87.178.291.200

    mais la dernière version donne

    1.278.945.280 !

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Ben si... C'est un dépassement de capacité, problème difficilement évitable avec l'exemple célèbre de la factorielle. Il faut pas monter jusqu'à dépasser la capacité, c'est tout.

    On pourrait mitiger en utilisant un BigInteger au lieu d'un int, mais l'écriture de l'algorithme devient abominablement lourde, ce qui est inutile pour ce simple exercice à destination des débutants. Et puis, on en trouverait qui commenceraient à calculer des nombres gigantesques et qui demanderaient pourquoi ça plante ou c'est si lent.

    Bonus point : au lieu de renvoyer un résultat inexact, prendre au moins la peine de lancer une Exception quand la factorielle ne peut pas faire le calcul demandé. Saurais-tu faire ça ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre averti Avatar de toutgrego
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2013
    Messages : 217
    Points : 350
    Points
    350
    Par défaut
    Salut, pour les fans de récursivité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import java.util.Scanner;
     
    /**
     *
     * @author toutgrego
     */
    public class Factoriel {
     
        public static Integer calc(Integer nb) throws Exception {
            if (nb > 12) {
                throw new Exception();
            }
            if (nb == 0) {
                return 1;
            } else {
                return nb * calc(Math.abs(nb - 1));
            }
        }
     
        public static void main(String[] argv) {
            System.out.println("Entrez un nombre ");
            Integer nb = new Scanner(System.in).nextInt();
            try {
                System.out.println("fact(" + nb + ") : " + Factoriel.calc(nb));
            } catch (Exception ex) {
                System.out.println("Le nombre est trop grand !");
            }
        }
    }
    =)
    F*ck it ! Do it !

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Pas mal, mais un peu dommage :

    - d'utiliser Integer au lieu de int
    - d'utiliser Exception au lieu d'un type plus spécialisé comme ArithmeticException
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par toutgrego Voir le message
    Salut, pour les fans de récursivité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import java.util.Scanner;
     
    /**
     *
     * @author toutgrego
     */
    public class Factoriel {
     
        public static Integer calc(Integer nb) throws Exception {
            if (nb > 12) {
                throw new Exception();
            }
            if (nb == 0) {
                return 1;
            } else {
                return nb * calc(Math.abs(nb - 1));
            }
        }
     
        public static void main(String[] argv) {
            System.out.println("Entrez un nombre ");
            Integer nb = new Scanner(System.in).nextInt();
            try {
                System.out.println("fact(" + nb + ") : " + Factoriel.calc(nb));
            } catch (Exception ex) {
                System.out.println("Le nombre est trop grand !");
            }
        }
    }
    =)
    résultats intéressants de ton programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fact(-1) : -2
    fact(-2) : -12
    fact(-3) : -72
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 133
    Points : 64
    Points
    64
    Par défaut
    salut à tous!
    factoriel ne marche que pour les entiers naturels, donc 0,1,2,3,4,..........
    ca ne marche pas pour les nombres relatifs(negatifs) comme -1,-2,-3,-4,.........

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    si l'opérateur factoriel ne s'applique qu'aux entiers naturels;
    la classe Factoriel indiquée permet, elle, de calculer, à tort, la factorielle d'un nombre négatif...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Autrement dit : puisqu'il avait fait l'effort de lancer une exception en cas de dépassement de capacité, il aurait pu aussi prendre la peine de le faire en cas de paramètre négatif.
    En y réfléchissant, l'emploi de Math.abs() montrait qu'il avait pensé aux nombres négatifs. Mais ce n'était pas du tout la bonne manière de faire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    yep

    défi plus intéressant, en continuant à travailler avec le type int, comment faire pour calculer des factorielles avec un opérande plus grand que 12,

    voilà mon essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    public class Factorial {
     
    	private final static boolean OPTIMIZED=true;
     
    	private final static int MAX_ZEROS = Integer.MAX_VALUE-1;
     
    	private final int n; 
    	private int zeros;
    	private int result;
     
    	private enum Status {
    		NEGATIVE_OPERAND(true),
    		OVERFLOW(true),
    		COMPUTED(false),
    		NOTCOMPUTED(false);
     
    		private final boolean error;
     
    		private Status(boolean error) {
    			this.error=error;
    		}
     
    		public final boolean isError() {
    			return error;
    		}
     
    	}
     
    	private Status status = Status.NOTCOMPUTED;
     
    	/**
             * 
             */
    	public Factorial(int n) {
    		this.n=n;
    		if ( this.n<0 ) {
    			status=Status.NEGATIVE_OPERAND;
    		} 
    	}
     
    	public final int getOperand() {
    		return n;
    	}
     
    	public final int getResultWithoutTrailingZeros() {
    		assertNotError();
    		return result;
    	}
     
    	public final int getTrailingZeros() {
    		assertNotError();
    		return zeros;
    	}
     
    	public final int getMultiplier() {
    		assertNotError();
    		return 10^zeros;
    	}
     
    	private void assertNotError() {
    		_compute();
    		switch (status) {
    		case NEGATIVE_OPERAND:
    			throw new ArithmeticException("Negative operand: " + n);
    		case OVERFLOW:
    			throw new ArithmeticException("Int overflow error: " + n +"!");
    		}
    	}
     
    	public final void compute() {
    		_compute();
    	}
     
    	private void _compute() {
    		if ( status!=Status.NOTCOMPUTED ) return;
    		result=1;
    		zeros=0;
    		for(int i=1; i<=n; i++) {
    			int ii = i;
    			if ( !OPTIMIZED ) {
    				// pas de différence de résultat qu'on fasse ça ou pas
    				int tz = trailingZeros(ii);
    				while ( tz>0 && zeros<MAX_ZEROS ) {
    					ii/=10;
    					zeros++;
    					tz--;
    				}
    			}
    			if ( willOverflow(result,ii) ) {
    				status=Status.OVERFLOW;
    				break;
    			}
    			else {
    				result*=ii;
    				int tzr = trailingZeros(result);
    				while ( tzr>0 && zeros<MAX_ZEROS ) {
    					result/=10;
    					zeros++;
    					tzr--;
    				}
    			}
    		}
    		if ( status==null ) {
    			status=Status.COMPUTED;
    		}
    	}
     
    	private int trailingZeros(int n) { 
    		if (n == 0) {
    	        return -1;
    	    }
    	    int count = 0;
    	    while (n % 10 == 0) {
    	        count++;
    	        n /= 10;
    	    }
    	    return count;
    	}
     
    	private boolean willOverflow(int a, int b) {
    		return a > (Integer.MAX_VALUE / b);
    	}
     
    	public final boolean isError() {
    		return getError().isError();
    	}
     
        public final boolean isOverflow() {
    		return getError()==Status.OVERFLOW;
    	}
     
    	public final Status getError() {
    		_compute();
    		return status;
    	}
     
    	@Override
    	public String toString() {
    		_compute();
    		switch (status) {
    			case NEGATIVE_OPERAND:
    				return "Negative operand: " + n;
    			case OVERFLOW:
    				return "Int overflow error: " + n +"!";
    		}
    		char[] trailingZeros=new char[zeros];
    		Arrays.fill(trailingZeros, '0');
    		return result + new String(trailingZeros);
    	}
     
    	public static void main(String[] args) {
     
    		int n=0; 
    		while(n<Integer.MAX_VALUE) {
    			Factorial f = new Factorial(n);
    			f.compute();
    			if ( f.isOverflow() ) {
    				break;
    			}
    			System.out.println(n + "! = " + f.toString() );
    			n++;
    		}
    		System.out.println("Cannot compute factorial for number greater or equals to " + n);
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  16. #16
    Membre averti Avatar de toutgrego
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2013
    Messages : 217
    Points : 350
    Points
    350
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    résultats intéressants de ton programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fact(-1) : -2
    fact(-2) : -12
    fact(-3) : -72
    Oups erreur de parenthesage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class Factoriel {
     
        public static Integer calc(Integer nb) throws Exception {
            if (nb > 12) {
                throw new Exception();
            }else if (nb == 0) {
                return 1;
            } else {
                return nb * calc(Math.abs(nb) - 1);
            }
        }
     
        public static void main(String[] argv) {
            System.out.println("Entrez un nombre ");
            Integer nb = new Scanner(System.in).nextInt();
            try {
                System.out.println("fact(" + nb + ") : " + Factoriel.calc(nb));
            } catch (Exception ex) {
                System.out.println("Le nombre est trop grand !");
            }
        }
    }
    Il est vrai que les nombres négatifs n'entrent pas dans les entiers naturels et que si on applique à la lettre la définition de factoriel on obtient une erreur pour tous les négatifs.

    Cependant -4!=24 par priorité d'opérateur, donc pour corriger mon erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class Factoriel {
     
        public static int calc(int nb) throws ArithmeticException {
            if (nb > 12 || nb < 0) {
                throw new ArithmeticException();
            } else if (nb == 0) {
                return 1;
            } else {
                return nb * calc(nb - 1);
            }
        }
     
        public static void main(String[] argv) {
            System.out.println("Entrez un nombre ");
            Integer nb = new Scanner(System.in).nextInt();
            try {
                System.out.println("fact(" + nb + ") : " + Factoriel.calc(nb));
            } catch (ArithmeticException ex) {
                System.out.println("Le nombre est trop grand !");
            }
        }
    }
    F*ck it ! Do it !

  17. #17
    Nouveau Candidat au Club Avatar de foufitou25
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2017
    Messages : 1
    Points : 1
    Points
    1
    Par défaut il faut changer le type int par Le type long (8 octets) peut aller de −9×1018 à 9×1018 (encore plus gros…).
    Citation Envoyé par joel.drigo Voir le message
    yep

    défi plus intéressant, en continuant à travailler avec le type int, comment faire pour calculer des factorielles avec un opérande plus grand que 12,

    voilà mon essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    public class Factorial {
     
    	private final static boolean OPTIMIZED=true;
     
    	private final static int MAX_ZEROS = Integer.MAX_VALUE-1;
     
    	private final int n; 
    	private int zeros;
    	private int result;
     
    	private enum Status {
    		NEGATIVE_OPERAND(true),
    		OVERFLOW(true),
    		COMPUTED(false),
    		NOTCOMPUTED(false);
     
    		private final boolean error;
     
    		private Status(boolean error) {
    			this.error=error;
    		}
     
    		public final boolean isError() {
    			return error;
    		}
     
    	}
     
    	private Status status = Status.NOTCOMPUTED;
     
    	/**
             * 
             */
    	public Factorial(int n) {
    		this.n=n;
    		if ( this.n<0 ) {
    			status=Status.NEGATIVE_OPERAND;
    		} 
    	}
     
    	public final int getOperand() {
    		return n;
    	}
     
    	public final int getResultWithoutTrailingZeros() {
    		assertNotError();
    		return result;
    	}
     
    	public final int getTrailingZeros() {
    		assertNotError();
    		return zeros;
    	}
     
    	public final int getMultiplier() {
    		assertNotError();
    		return 10^zeros;
    	}
     
    	private void assertNotError() {
    		_compute();
    		switch (status) {
    		case NEGATIVE_OPERAND:
    			throw new ArithmeticException("Negative operand: " + n);
    		case OVERFLOW:
    			throw new ArithmeticException("Int overflow error: " + n +"!");
    		}
    	}
     
    	public final void compute() {
    		_compute();
    	}
     
    	private void _compute() {
    		if ( status!=Status.NOTCOMPUTED ) return;
    		result=1;
    		zeros=0;
    		for(int i=1; i<=n; i++) {
    			int ii = i;
    			if ( !OPTIMIZED ) {
    				// pas de différence de résultat qu'on fasse ça ou pas
    				int tz = trailingZeros(ii);
    				while ( tz>0 && zeros<MAX_ZEROS ) {
    					ii/=10;
    					zeros++;
    					tz--;
    				}
    			}
    			if ( willOverflow(result,ii) ) {
    				status=Status.OVERFLOW;
    				break;
    			}
    			else {
    				result*=ii;
    				int tzr = trailingZeros(result);
    				while ( tzr>0 && zeros<MAX_ZEROS ) {
    					result/=10;
    					zeros++;
    					tzr--;
    				}
    			}
    		}
    		if ( status==null ) {
    			status=Status.COMPUTED;
    		}
    	}
     
    	private int trailingZeros(int n) { 
    		if (n == 0) {
    	        return -1;
    	    }
    	    int count = 0;
    	    while (n % 10 == 0) {
    	        count++;
    	        n /= 10;
    	    }
    	    return count;
    	}
     
    	private boolean willOverflow(int a, int b) {
    		return a > (Integer.MAX_VALUE / b);
    	}
     
    	public final boolean isError() {
    		return getError().isError();
    	}
     
        public final boolean isOverflow() {
    		return getError()==Status.OVERFLOW;
    	}
     
    	public final Status getError() {
    		_compute();
    		return status;
    	}
     
    	@Override
    	public String toString() {
    		_compute();
    		switch (status) {
    			case NEGATIVE_OPERAND:
    				return "Negative operand: " + n;
    			case OVERFLOW:
    				return "Int overflow error: " + n +"!";
    		}
    		char[] trailingZeros=new char[zeros];
    		Arrays.fill(trailingZeros, '0');
    		return result + new String(trailingZeros);
    	}
     
    	public static void main(String[] args) {
     
    		int n=0; 
    		while(n<Integer.MAX_VALUE) {
    			Factorial f = new Factorial(n);
    			f.compute();
    			if ( f.isOverflow() ) {
    				break;
    			}
    			System.out.println(n + "! = " + f.toString() );
    			n++;
    		}
    		System.out.println("Cannot compute factorial for number greater or equals to " + n);
     
    	}
     
    }

  18. #18
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par foufitou25 Voir le message
    il faut changer le type int par Le type long
    Citation Envoyé par joel.drigo Voir le message
    en continuant à travailler avec le type int
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  19. #19
    Candidat au Club
    Homme Profil pro
    etudiant
    Inscrit en
    Janvier 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 1
    Points : 2
    Points
    2
    Par défaut CALCUL DE FACTORIEL
    J'ai bien vu vos programme, j'ai une autre requête.
    si le programme pouvait afficher le calcul du factoriel avant le résultat, exemple.

    8!=1*2*3*4*5*6*7*8 puis le résultat. Merci à vous urgentt!!!

  20. #20
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Hello,

    il est possible de faire un programme comme ça, oui.

    As-tu essayé ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant][Conception] Factorielle en Java par recursivité
    Par Sylvester dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 02/11/2008, 20h42
  2. exception dans un calcul de factorielle
    Par ranell dans le forum Langage
    Réponses: 6
    Dernier message: 21/10/2007, 19h01
  3. Prog pour calculer la factorielle d'un nombre
    Par Lenezir dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2007, 09h42
  4. Calcul du factorielle
    Par knecmotet dans le forum C
    Réponses: 15
    Dernier message: 16/09/2005, 11h33
  5. fonction qui calcule la factorielle ?
    Par piff62 dans le forum C
    Réponses: 8
    Dernier message: 27/02/2005, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo