2016-02-28 1 views
-2

Я пытаюсь написать программу, которая печатает ВСЕ основные факторы, а также задает наименьший простой коэффициент числа от пользовательского ввода. (например, если указано 12, основные факторы - 2, 2 и 3.) Я немного поработал, но все результаты для программ, которые помнят все основные факторы, как представляется, используют <>. По какой-то причине это не признается. Мне было интересно, есть ли альтернатива этому?Prime Factors, Alternative to Diamond Brackets

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

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
import java.util.Scanner; 
public class PrimeFactor { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Scanner in = new Scanner(System.in); 
    System.out.println("Please enter an integer"); 
    long n = in.nextLong(); 
    System.out.println("Smallest prime factor of "+n+" is "+leastFactor(n)); 
} 

public static ArrayList<Integer> leastFactor(long n) { 
    ArrayList primeFactors = new ArrayList<Integer>(); 
    for (int i=2; i<=n; i++) { 
     if (n%i==0) { 
      primeFactors.add(i); 
     } 
    } 

    if(primeFactors.size() > 0){ 
     return (primeFactors); 
    } 
} 
} 
+1

Таким образом, вы не делали исследования на то, что <> означает и правильный способ формирования набираемого набора/HashSet? – pczeus

ответ

0
Scanner z = new Scanner(System.in); 
//int n; 
long n;//long to display all prime factors. 
List primefactors = new ArrayList(): 
System.out.print("Enter a Number : "); 
//n= z.nextInt(); 
n = z.nextLong(); 
System.out.print("The Prime Factors of "+n+" are : "); 
int i=2; 
while(n>1) 
    { 
    if(n%i == 0) 
    { 
    primefactors.add(i); 
    n=n/i; 
    } 
    else 
    i++; 
    } 
System.out.println(Collections.min(primefactors)); 
primefactors.forEach(System.out::println);//to display all values 

Надеюсь, вы нашли мой код полезным.

+0

Спасибо! Этот код был очень полезен. Есть ли способ показать все основные факторы? Таким образом, для больших чисел будет отображаться несколько 2 или 3 и т. Д. – stuffandthings

+0

конвертировать int в код для отображения всех возможных комбинаций. и я добавил для каждого цикла, чтобы отобразить все элементы в массиве primmefactors arraylist. Я надеюсь, что вы получили ответ на запрошенные изменения. Спасибо. – SmashCode

+0

Есть ли способ вернуть эти данные вместо их печати? Я хотел бы использовать 2 отдельных метода и вызывать основной метод. (Обращаясь к последней строке.) – stuffandthings

0

Введенные ниже изменения исправить ваш код. Обратите внимание на Set<Integer>. Вам нужно добавить type информацию о том, что будет содержаться в пределах Set. <> - это просто стенография, поэтому вам не нужно повторять Integer. Другими словами, вы могли бы сделать что-либо:

Set<Integer> primeFactors = new HashSet<>(); 

Или:

Set<Integer> primeFactors = new HashSet<Integer>(); 

Вот ваш измененный код:

import java.util.Scanner; 
import java.util.HashSet; 
import java.util.Set; 
public class PrimeFactor { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Please enter an integer"); 
     int input = sc.nextInt(); 
     System.out.println(leastFactor(input)); 
    } 

    public static int leastFactor(int input) { 
     Set<Integer> primeFactors = new HashSet<>(); 
     for (int i=2; i<=input; i++) { 
      if (input%i==0) { 
       primeFactors.add(i); 
      } 
     } 

     if(primeFactors.size() > 0){ 
      return primeFactors.toArray(new Integer[primeFactors.size()])[0]; 
     } 
     return 1; 
    } 
} 

Теперь ваши primeFactors были заполнены. Я добавил дополнительную проверку размера primeFactors, и если у нее есть элементы, верните первый элемент, который будет самым маленьким. Если у него нет элементов, возврат 1

0

BTW: Вы можете легко увеличить скорость вас кода с изменяющимся значением верхнего цикла

for (int i=2; i<=input; i++) { 
... 
} 

на квадратный корень из вашего input

int upper = Math.round(Math.sqrt(input)); 
for (int i = 2; i < upper; i++) { 
... 
}