Проблема с генератором факторов

У меня возникли проблемы с завершением этого генератора факторов из моего класса программирования. Предполагается взять число и распечатать все факторы, используя метод nextFactor. Когда я устанавливаю число в коэффициент, скажем, 150, он печатает "1 2 3 5", где он должен печатать "2 3 5 5". Итак, куда мне идти отсюда? Я посмотрел на следующий фактор метода программы Java - Factor Generator, но он не удивил ни одного из моих запросов

public class FactorGenerator
{
    //user inputs int from scanner in FactorTester class
    public FactorGenerator(int i)
    {
        num = i;
    }

    //Checks to see if num can be factored, but does not factor it.
    //Goes through all possible factors of num and returns true if the remainder == 0
    public boolean hasMoreFactors()
    {       
        for(int i = 1; i < num; i++)
        {
            //check if the remainder is anything other then 0
            if(num % i == 0)
            {
                return true;
            }
        }

        return false;
    }

  //Actually factors num and prints out the factor at the end of every loop.
    public void nextFactor() 
    {
        for(int i = 1; i < num; i++)
        {
            //check if the remainder is anything other then 0
            if(num % i == 0)
            {
                System.out.println(i);
                num /= i;
            }            


        }

        System.out.println("Done.");
    }

    private int num;
}

2 ответа

Решение

Попробуйте, что эти факторы могут дублироваться, поэтому вам нужно выполнить цикл, пока вы не извлечете все экземпляры этого фактора.

public void nextFactor() 
{
    for(int i = 2; i <= num; i++)
    {
        //check if the remainder is anything other then 0
        while (num >= i && num % i == 0)
        {
            System.out.println(i);
            num /= i;
        }           

    }

    System.out.println("Done.");
}

альтернативный способ - сделать приращение в теле цикла.

public void nextFactor() 
{
    for(int i = 2; i <= num;)
    {
        //check if the remainder is anything other then 0
        if (num % i == 0)
        {
            System.out.println(i);
            num /= i;
        } else {
           i++;
        }

    }

    System.out.println("Done.");
}

Для начала, он всегда будет печатать 1, потому что любое целое число / 1 всегда будет иметь остаток от нуля. Вы можете начать с 2 вместо 1, если хотите пропустить 1.

Я бы предложил что-то вроде этого: (обратите внимание, что это частично основано на ответе BevynQ ниже):

for(int i = 2; i <= num; i++){
    while (num >= i && num % i == 0) {
        System.out.println(i);
        num /= i;
    }
}        
Другие вопросы по тегам