0
votes

Multiplier les chiffres d'un nombre jusqu'à ce que vous atteigniez un nombre à un chiffre

Supposons que vous entrez le nombre 546, puis vous devriez trouver le produit de ses chiffres, qui est 5 4 6 = 120, puis multipliez les chiffres de 120 jusqu'à et ainsi de suite, continuez jusqu'à ce que vous obteniez un nombre à un chiffre. Voici le code que j'ai écrit, mais la boucle ne fonctionne pas correctement et j'ai essayé de le réparer, mais rien n'a changé. Pourriez-vous m'aider s'il vous plait?

import java.util.*;
public class Product {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        int a = keyboard.nextInt();
        System.out.println("Please input the number");
        numberOfProducts(a);


    }
    public static void numberOfProducts(int n){
        int product = 1;
        while(n>10) {
            int current = n;
            while (current != 0) {
                product = product * (current % 10);
                current = current / 10;
                n = product;
                System.out.println(product);
            }
        }

    }

}


0 commentaires

5 Réponses :


2
votes

Après avoir parcouru votre code, votre problème semble résider dans cette expression: current % 10 . L'opération modulo vous donne le reste d'une division par dix. Dans le cas de votre entrée 120, le résultat de cette opération serait 0.

Après le reste de la logique de votre application, votre variable d'itération sera mise à zéro, mettant fin immédiatement à votre boucle.

Je ne vous donnerai pas de code copier-coller pour résoudre ce problème, car cela ressemble à un devoir de cours de programmation. Je vais cependant vous aider à le résoudre.

Ma solution suggérée est de changer votre approche de ce problème et non pas d'essayer de le résoudre de manière mathématique, mais plutôt d'une manière qui tire parti du langage de programmation Java. Vous pouvez changer votre entrée d'un entier à une chaîne. Dans ce cas, vous pouvez utiliser String.length () pour vous assurer que votre condition est remplie lorsque vous quittez la boucle. Dans votre boucle, vous divisez la chaîne en sous-chaînes de longueur 1. Ensuite, vous les multipliez simplement.

Lorsque la boucle se termine (car la longueur de la chaîne n'est pas supérieure à 1), vous obtiendrez le résultat souhaité.

Bonne chance!


0 commentaires

2
votes

Je pense que vous cherchez quelque chose comme le code ci-dessous:

Please input the number: 546
546
120
0

Lorsque le code ci-dessus s'exécute, avec 546 en entrée, il génère:

import java.util.Scanner;

public class Main {
    public static int numberOfProducts(String number) {
        int product = 1;
        do {
            for (int i = 0; i < number.length(); ++i){
                // This line converts the every digit of the number string to an integer.
                product *= number.charAt(i) - '0';
            }
            // Remove this line, if you don't want to print the product of each iteration.
            System.out.println(number);
            // Update number with the new product.
            // This line converts the int product to a new string.
            number = "" + product;
        } while (product > 10);
        return product;
    }
    public static void main(String[] args) {
        System.out.print("Please input the number: ");
        Scanner keyboard = new Scanner(System.in);
        int a = keyboard.nextInt();
        // Treat number as a string for easier indexing.
        String number = "" + a;
        System.out.println(numberOfProducts(number));
    }
}


0 commentaires

0
votes
import java.util.*;
public class Product {
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        int a = keyboard.nextInt();
        System.out.println("Please input the number");
        numberOfProducts(a);
    }
      public static void numberOfProducts(int n){
        int product = 1; 
  
        while (n != 0)   { 
        product = product * (n % 10); 
        n = n / 10; 
        } 
    
        if(product > 10) {
            System.out.println("Intermediate result="+product);
            numberOfProducts(product);
        }
        else
            System.out.println("Final 1 digit product="+product);

    }
}

0 commentaires

1
votes

Pour une approche différente de la solution, vous pouvez utiliser un recursive lambda

import java.util.Scanner;
import java.util.function.IntFunction;

public class Product {
    // this simply reduces the number to the product of its digits.
    static IntFunction<Integer> prod =
            (a) -> a < 10 ? a : a % 10 * Product.prod.apply(a / 10);

    public static void main(String[] args) {

        Scanner keyboard = new Scanner(System.in);
        System.out.print("Please input the number");
        int n = keyboard.nextInt();

        // Now continue applying the lambda until the result is < 10.
        while (n > 10) {
            n = prod.apply(n);
        }
        System.out.println(n);
    }
}


0 commentaires

1
votes

En fait, votre code est très proche d'être correct, la seule chose que vous faites de mal est que vous ne réinitialisez pas la variable de product entre les itérations. Vous devez simplement déplacer le int product = 1; instruction à l'intérieur de la boucle while externe.

De plus, si vous voulez un seul chiffre à la fin, votre condition doit être while(n >= 10) ou while(n > 9) , puisque 10 est toujours 2 chiffres, nous avons donc besoin d'une itération de plus!

Remarque finale: il est parfois plus facile de diviser votre code en plus petits morceaux. Il est plus facile à comprendre et plus facile à tester / déboguer! Par exemple, vous pourriez avoir d'abord créé une fonction productOfDigits(n) qui renvoie le résultat d'une seule itération, puis une autre fonction productOfDigitsUntilSingleDigit(n) qui appelle à plusieurs reprises la fonction précédente.


0 commentaires