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

Java Discussion :

Problème avec les factorielles [projecteuler.net]


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 149
    Par défaut Problème avec les factorielles [projecteuler.net]
    Bonjour,
    Je suis actuellement en train de résoudre ce problème : https://projecteuler.net/problem=20,
    cependant un gros problème que je ne comprend pas se pose à moi; lorsque je souhaite calculer
    avec mon algorithme le factorielle de 5, tout marche parfaitement. Mais quand j'essais par exemple
    de calculer le factorielle de 100, ça marche plus, ça retourne 0. Je me suis demandé si c'était un problème de type
    de variable, cependant que ce soit des long ou des int, le résultat est identique...

    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
    public static void main(String[] args) {
     
    		System.out.println(factorial(5));//affiche 120
     
    		System.out.println(factorial(100)); //afficher 0 alors que le resultat devrait etre 9.332622e+157 
    	}
     
    	public static int factorial(int value) {
    		int result = 0;
     
    		if(isStrictlyPopsitive(value)) {
    			result = 1;
    			for(int i = 1; i <= value; i++) 
    				result *= i;
    		}
     
    		return result;	
    	}
     
    	public static boolean isStrictlyPositive(int value) {
    		if(value > 0)
    			return true;
    		else
    			return false;
    	}
    PS: J'ai décidé de ne pas vous montrer les autres méthodes qui de toutes façon marchent parfaitement bien,
    et j'en profite pour dire que sans vérifier si la valeur est strictement positive, le résultat reste le même.

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Ton problème est que tu tente de calculer un chiffre qui ne tient ni dans un int ni dans un long, essaye éventuellement avec BigDecimal...
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 149
    Par défaut
    Maintenant ça retourne tout le temps 0 !
    Non mais plus sérieusement je crois que j'ai un problème avec la ligne 12, mais je ne vois pas du tout lequel...

    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
     
    public static void main(String[] args) {
     
    		System.out.println(factorial(5)); // retourne 0...
    	}
     
    	public static BigInteger factorial(int value) {
     
    		BigInteger result = new BigInteger("0");
     
    		if(isStrictlyPositive(value)) {
    			result.equals("1");
    			for(BigInteger i = new BigInteger("1"); bigIntegerIsEqualOrLess(i, new BigInteger(String.valueOf(value))); i = bigIntegerIncrement(i)) { 
    				result = result.multiply(i);
     
    			}
     
    		}
     
    		return result;	
    	}
     
    	public static boolean isStrictlyPositive(int value) {
    		if(value > 0)
    			return true;
    		else
    			return false;
    	}
     
    	public static boolean bigIntegerIsEqualOrLess(BigInteger value1, BigInteger value2) {
    		if(value1.compareTo(value2) == -1 || value1.compareTo(value2) == 0)
    			return true;
    		else 
    			return false;
    	}
     
    	public static BigInteger bigIntegerIncrement(BigInteger value) {
    		BigInteger result = value.add(new BigInteger("1"));
     
    		return result;
    	}

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 149
    Par défaut
    C'est bon, j'ai réussi en remplaçant "result.equals("1");" par une incrémentation; "result.equals()" renvoie en fait un boolean...
    Merci de l'aide !
    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
     
    public static void main(String[] args) {
    		System.out.println(factorial(100)); 
    	}
     
    	public static BigInteger factorial(int value) {
     
    		BigInteger result = new BigInteger("0");
     
    		if(isStrictlyPositive(value)) {
    			result = bigIntegerIncrement(result);
     
    			for(BigInteger i = new BigInteger("1"); bigIntegerIsEqualOrLess(i, new BigInteger(String.valueOf(value))); i = bigIntegerIncrement(i)) { 
    				result = result.multiply(i);
     
    			}
     
    		}
     
    		return result;	
    	}
     
    	public static boolean isStrictlyPositive(int value) {
    		if(value > 0)
    			return true;
    		else
    			return false;
    	}
     
    	public static boolean bigIntegerIsEqualOrLess(BigInteger value1, BigInteger value2) {
    		if(value1.compareTo(value2) == -1 || value1.compareTo(value2) == 0)
    			return true;
    		else 
    			return false;
    	}
     
    	public static BigInteger bigIntegerIncrement(BigInteger value) {
    		BigInteger result = value.add(new BigInteger("1"));
     
    		return result;
    	}

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 149
    Par défaut
    J'ai même trouvé plus cohérent !

    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
     
    public static void main(String[] args) {
    		System.out.println(factorial(100)); 
    	}
     
    	public static BigInteger factorial(int value) {
     
    		BigInteger result = new BigInteger("0");
     
    		if(isStrictlyPositive(value)) {
    			result = new BigInteger("1");
     
    			for(BigInteger i = new BigInteger("1"); bigIntegerIsEqualOrLess(i, new BigInteger(String.valueOf(value))); i = bigIntegerIncrement(i)) { 
    				result = result.multiply(i);
     
    			}
     
    		}
     
    		return result;	
    	}
     
    	public static boolean isStrictlyPositive(int value) {
    		if(value > 0)
    			return true;
    		else
    			return false;
    	}
     
    	public static boolean bigIntegerIsEqualOrLess(BigInteger value1, BigInteger value2) {
    		if(value1.compareTo(value2) == -1 || value1.compareTo(value2) == 0)
    			return true;
    		else 
    			return false;
    	}
     
    	public static BigInteger bigIntegerIncrement(BigInteger value) {
    		BigInteger result = value.add(new BigInteger("1"));
     
    		return result;
    	}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec les diagrammes de CR en VB.net
    Par red_one dans le forum VB.NET
    Réponses: 0
    Dernier message: 25/06/2009, 12h41
  2. Réponses: 5
    Dernier message: 17/01/2008, 13h18
  3. [VB.net] Problème avec les paramètres d'un update
    Par dolyne.b dans le forum Accès aux données
    Réponses: 5
    Dernier message: 16/05/2007, 17h00
  4. [VB.net][vs2005] Problème avec les expressions régulières
    Par zouhib dans le forum Windows Forms
    Réponses: 13
    Dernier message: 22/06/2006, 15h56
  5. problèmes avec les CSS en ASP.NET ?
    Par fr3d dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 16/09/2005, 14h23

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