1
votes

Imprimer le facteur premier dans un motif défini

Je dois imprimer le facteur premier de n'importe quel nombre dans ce format. Ex: 32 = 2 * 2 * 2 * 2 * 2 Voici mon code. Cela fonctionne bien pour tous sauf pour 32, cela donne: 2 * 2 * 2 * 2 * 2 * Comment éviter le dernier *. Voici mon code: classe publique PF {

public static void pf(int n) {

    for(int i = 2; i< n; i++) {
         while(n%i == 0) {
            System.out.print(i+ "*");
            n = n/i;
         }
    }

    if (n > 2) System.out.print(n); 
}

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    System.out.println("Enter a number");
    int n = sc.nextInt();
    pf(n);
}


0 commentaires

4 Réponses :


1
votes

Une option consiste à stocker les valeurs dans une liste et à les imprimer ensemble comme ceci:

public static void pf(int n) {

    List<String> l = new ArrayList<>();

    for (int i = 2; i < n; i++) {
        while (n % i == 0) {
            l.add(String.valueOf(i));
            n = n / i;
        }
    }

    System.out.print(String.join("*", l));

    if (n > 2) {
        System.out.print("*" + n);
    }        
}


0 commentaires

2
votes

Autre option, vous pouvez éviter le * when n = i dans votre boucle while

public static void pf(int n) {

    for (int i = 2; i < n; i++) {
        while (n % i == 0) {
            System.out.print(i);
            if (n != i) {
                System.out.print("*");
            }
            n = n / i;
        }
    }


    if (n > 2)
        System.out.print(n);
}


0 commentaires

0
votes

J'ai fait cela de deux manières.

Type 1

public static void pf(int n) {

    for(int i = 2; i< n; i++) {
        while(n%i == 0) {
            System.out.print(i+ ((i<n) ? "*" : "")); //Skip the unwanted character(*)
            n = n/i;
        }
    }

    if (n > 2) System.out.print(n);
}

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    System.out.println("Enter a number");
    int n = sc.nextInt();
    pf(n);
}

Type 2

public static void pf(int n) {

    for(int i = 2; i< n; i++) {
        while(n%i == 0) {
            System.out.print(i+ "*");
            n = n/i;
            System.out.print(i>n ? "\b" : "");  //Backspase and remove unwanted character(*) after print
        }
    }

    if (n > 2) System.out.print(n);
}

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    System.out.println("Enter a number");
    int n = sc.nextInt();
    pf(n);
}

p>


0 commentaires

0
votes

Vous avez un problème de formatage. Il est logique de le séparer du calcul initial; mieux vaut traiter différents problèmes séparément.

Vous pouvez générer une liste de facteurs premiers et écrire une méthode pour imprimer la liste dans le format correct. Pour ce problème général, j'ai tendance à traiter la liste comme une tête avec un élément qui n'est pas précédé du séparateur et une queue avec toutes les autres entrées, chacune d'entre elles étant précédée par le séparateur, votre `` * '' ou peut-être une virgule dans le cas le plus courant. Plutôt que de supprimer le séparateur après la dernière entrée de la liste, considérez-le comme une suppression du séparateur avant la première entrée. Il est plus facile d'identifier le premier élément d'une liste que le dernier.

Mon code n'est pas strictement Java, mais vous donne une idée générale.

void printSeparatedList(factorList) {
  char separator = '*';
  bool firstEntry = true;

  for (int factor : factorList) {
    if (firstEntry) {
      firstEntry = false;
    } else {
      System.out.print(separator);
    }
    System.out.print(factor);
  }
} // End printSeparatedList

p>


0 commentaires