Reputation: 9
I am trying to write a program that prints ALL prime factors, as well as specify the smallest prime factor of the number from user input. (e.g. If 12 is given, prime factors are 2, 2, and 3.) I have done a bit of searching, but all results for programs that remember all prime factors seem to use <>. For some reason, this is not recognized. I was wondering if there was an alternative way around this?
Edit: I have successfully printed lowest factors, but am still having trouble with printing all prime factors. Edited code:
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);
}
}
}
Upvotes: -2
Views: 138
Reputation: 761
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
Hope you found my code useful.
Upvotes: 0
Reputation: 3344
BTW: you can easily increase speed of you code with a changing upper cycle value
for (int i=2; i<=input; i++) {
...
}
to square root from your input
int upper = Math.round(Math.sqrt(input));
for (int i = 2; i < upper; i++) {
...
}
Upvotes: 0
Reputation: 7867
The below modifications fix your code. Note the Set<Integer>
. You need to add the type
information of what will be contained within the Set
. The <>
is just shorthand so you don't have to repeat Integer
. In other words, you could do either:
Set<Integer> primeFactors = new HashSet<>();
Or:
Set<Integer> primeFactors = new HashSet<Integer>();
Here is your modified code:
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;
}
}
Now your primeFactors have been populated. I have added the additional check for the size of primeFactors and if it has elements, return the first element, which will be the smallest. If it has no elements, return 1
Upvotes: 0