Следующий код вернет список всех факторов данного числа:
public ArrayList<Integer> findFactors(int num) {
ArrayList<Integer> factors = new ArrayList<Integer>();
// Skip two if the number is odd
int incrementer = num % 2 == 0 ? 1 : 2;
for (int i = 1; i <= Math.sqrt(num); i += incrementer) {
// If there is no remainder, then the number is a factor.
if (num % i == 0) {
factors.add(i);
// Skip duplicates
if (i != num / i) {
factors.add(num / i);
}
}
}
// Sort the list of factors
Collections.sort(factors);
return factors;
}
Этот ответ улучшает Ответ Шарад Даргана двумя способами:
Основываясь на идее, использованной в в этом ответе , вы можете ускорить решение, определив значение для приращения на основе четного или нечетного числа.
Добавьте следующую строку кода перед циклом for:
int incrementer = num % 2 == 0 ? 1 : 2;
Затем измените последнюю часть цикла на:
i += incrementer
Если число нечетное, оно будет пропускать все четные числа, а не всегда увеличиваться на единицу независимо от того, что.
Sharad сохраняет значение верхнего предела в переменной, а затем использует эту переменную в цикле for:
int upperlimit = (int)(Math.sqrt(a));
...
for(int i = 1; i <= upperlimit; i+= 1)
Вместо этого поместите Math.sqrt(num)
непосредственно в цикл for и пропустите верхнюю граничную переменную:
for (int i = 1; i <= Math.sqrt(num); i += incrementer) {
Это позволит вам пропустить часть кода, создающую более чистый код.
Некоторые тестовые случаи JUnit, которые вы можете использовать:
@Test
public void test12() {
FindFactors find = new FindFactors();
int num = 12;
List<Integer> factors = Arrays.asList(1, 2, 3, 4, 6, 12);
assertEquals(factors, find.findFactors(num));
}
@Test
public void test1000000() {
FindFactors find = new FindFactors();
int num = 1000000;
List<Integer> factors = Arrays.asList(1, 2, 4, 5, 8, 10, 16, 20, 25, 32, 40, 50, 64, 80, 100, 125, 160, 200,
250, 320, 400, 500, 625, 800, 1000, 1250, 1600, 2000, 2500, 3125, 4000, 5000, 6250, 8000, 10000, 12500,
15625, 20000, 25000, 31250, 40000, 50000, 62500, 100000, 125000, 200000, 250000, 500000, 1000000);
assertEquals(factors, find.findFactors(num));
}
@Test
public void test1() {
FindFactors find = new FindFactors();
int num = 1;
List<Integer> factors = Arrays.asList(1);
assertEquals(factors, find.findFactors(num));
}
@Test
public void test0() {
FindFactors find = new FindFactors();
int num = 0;
List<Integer> factors = new ArrayList<Integer>();
assertEquals(factors, find.findFactors(num));
}