Прайм Факторизация с показателями в Java - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь написать код java, который отображает простую факторизацию числа в двух формах: умножается и умножается на экспоненты. Например, правильный вывод будет выглядеть следующим образом:

Введите число

100

Простая факторизация 100:

100 = 2 * 2 * 5 * 5

100 = 2 ^ 2 * 5 ^ 5

Кроме того, мой текущий код выводит только это:

Enter число

100

Простая факторизация 100:

100 = 2 2 5 5

Вот как выглядит мой код:

import java.util.Scanner;
public class Factorization {
public static void main(String[] args) { 
    Scanner keyboard = new Scanner(System.in);
    // user inputs variables here
    System.out.println("Enter a number");
    long n = keyboard.nextLong();
    System.out.println("The prime factorization of " + n + " is: ");
    System.out.print(n+" = ");

    // solution for 1 as an input

    if(n==1){
        System.out.println("1");
    }

    // for each potential factor
    for (long factor = 2; factor*factor <= n; factor++) {

        // if factor is a factor of n, repeatedly divide it out
        while (n % factor == 0) {
            System.out.print(factor + " "); 
            n = n / factor;
        }
    }

    // if biggest factor occurs only once, n > 1
    if (n > 1){
        System.out.println(n);
    } else {
        System.out.println();
    }
}
}

Как мне сделать так, чтобы он выдал правильный вывод?

Спасибо большое!

1 Ответ

0 голосов
/ 25 марта 2020

Распечатка первой формы проста и потребует небольшого изменения кода, чтобы распечатать *. Вторая форма, однако, немного сложнее, поскольку вы не можете просто распечатать факторы по мере их получения, так как вам нужно подсчитать, сколько раз каждый из них узнает их показатель степени. Есть несколько разных способов сделать это, но я подумал, что проще всего будет использовать 2 ArrayLists. Один из этих списков ArrayLists будет содержать базы, в то время как другой будет содержать показатели для каждой базы. Это моя реализация, и я добавил несколько комментариев для пояснения.

import java.util.Scanner;
import java.util.ArrayList;
public class Factorization{
public static void main(String[] args) { 
    Scanner keyboard = new Scanner(System.in);
    // user inputs variables here
    System.out.println("Enter a number");
    long n = keyboard.nextLong();
    long m = n;
    System.out.println("The prime factorization of " + n + " is: ");
    System.out.print(n+" = ");
    ArrayList<Long> bases = new ArrayList<Long>(); //ArrayList containing each unique factor
    ArrayList<Long> exponents = new ArrayList<Long>(); //ArrayList containing exponents, or the amount of times that factor is multiplied

    // solution for 1 as an input

    if(n==1){
        System.out.println("1");
    }
    // for each potential factor
    for (long factor = 2; factor*factor <= n; factor++) {

        // if factor is a factor of n, repeatedly divide it out
        while (n % factor == 0) {
            n = n / factor;
            if (!bases.contains(factor)){ //if the factor is not already in the bases list, it's unique and should be added
                bases.add(factor);
                exponents.add(1L);
            }
            else{ //if the factor is already in the bases list, increment its exponent by 1
                exponents.set(bases.indexOf(factor), exponents.get(bases.indexOf(factor)) + 1);
            }
        }
    }

    // if biggest factor occurs only once, n > 1
    if (n > 1){
        if (!bases.contains(n)){
                bases.add(n);
                exponents.add(1L);
        }
        else{
            exponents.set(bases.indexOf(n), exponents.get(bases.indexOf(n)) + 1);
        }
    }
    //printing out the first form
    for (int i = 0; i < bases.size(); i++) 
    {
        for (int j = 0; j < exponents.get(i); j++) //each base is printed out an amount of times equal to its exponent
        {
            if (i != 0 || j != 0) //making sure we don't print * before the first base
            {
                System.out.print(" * ");
            }
            System.out.print(bases.get(i));
        }
    }
    System.out.println();
    System.out.print(m+" = ");
    //printing out the second form
    for (int i = 0; i < bases.size(); i++) 
    {
        if (i >= 1) //making sure we don't print * before the first base
        {
            System.out.print(" * ");
        }
        System.out.print(bases.get(i) + "^" + exponents.get(i));
    }
}
}

Если вы хотите узнать больше о ArrayLists, я рекомендую вам ознакомиться с официальной Java документацией по этому вопросу здесь: https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html. Надеюсь, это поможет.

...