2016-11-05 2 views
0
import java.util.Scanner; 

public class JavaApplication1 { 
    public static void main(String[] args) { 
    Scanner kboard = new Scanner(System.in); 
    int n = 0; 
    int i = 1; 

    System.out.println("Enter a positive number"); 
    n = kboard.nextInt(); 
    System.out.print("The Prime Factors of " + n + " are : "); 
    value = 2; 
    while (n > 1) { 
     i = 1; 
     if (n % i != 0){ 
      i = 1; 
      i=i+1; 
      if(n % i == 0){ 
       System.out.println(" "+ i); 
      } 
     } 
     else { 
      System.out.print("1 and " + n); 
      break; 
     } 
    } 

    } 
} 

Это моя программа, и я начал кодирование около месяца назад, но программа дает только 1, а число - как результат, а не простые.Первичная факторизация в программе для класса

+0

Где вы уменьшаете n, как только вы обнаружили, что n делится на i? Также вы должны начать ** i ** с 2. –

ответ

0

Программа всегда дает 1 как выход из-за этого:

i = 1; 
if (n % i != 0) { 
    // ... 
} else { 
    System.out.print("1 and " + n); 
    break; 
} 

С i = 1, n % i != 0 является ложным, потому что любой n модуль 1 будет равен 0. Так всегда else блок запускается на выполнение и вы сразу же выходите из цикла while.

Даже если вы это исправить, есть много других вопросов в этой программе:

  • Условие n > 1 является нонсенсом, так как n никогда не меняется в этом цикле, так что условие всегда true.
  • Проверка % 1 бессмысленно, поскольку каждое число делится на 1. Вы должны начать проверку из 2.

С незначительными улучшениями, петля может быть улучшена, чтобы найти факторы:

List<Integer> factors = new ArrayList<>(); 
for (int i = 2; i <= Math.sqrt(n); i++) { 
    if (n % i == 0) { 
     factors.add(i); 
    } 
} 

Но это не так хорошо. Здесь найдутся все факторы, а не только простые факторы. Например, для номера 40 найдутся 2, 4, 5, 8, 10, , из которых только 2 и 5 являются простыми. Одним простым решением является добавление другого метода, называемого isPrime, который проверяет, является ли число простым.

0

Это должно сделать простой трюк для вас: Просто установите номер из пользовательского ввода.

List<Integer> result = new ArrayList<>(); 

      // Take out the 2s. 
      while (num % 2 == 0) 
      { 
       result.Add(2); 
       num /= 2; 
      } 

      // Take out other primes. 
      int factor = 3; 
      while (factor * factor <= num) 
      { 
       if (num % factor == 0) 
       { 
        // This is a factor. 
        result.Add(factor); 
        num /= factor; 
       } 
       else 
       { 
        // Go to the next odd number. 
        factor += 2; 
       } 
      } 

      // If num is not 1, then whatever is left is prime. 
      if (num > 1) result.Add(num); 

      return result; 
0

Если вы хотите, чтобы получить все простые делители, вы можете попробовать:

int i = 2; 
    while (n > 1) { 
     if (n % i == 0) { 
      System.out.print(" " + i); 
      while (n % i == 0) { 
       n /= i; 
      } 
     } 
     i++; 
    } 

Если n = 960 печатает 2 3 5.

Если n = 11 печатается 11.

Как вы уверены, что не считаете число, которое не является простым?

  • Второй цикл while делит число как можно больше. Таким образом, число не будет разделено на 4, потому что, если бы это было возможно, он уже был разделен на 2 раза.

Если вы хотите, чтобы получить показатель для этих простых множителей, вы можете инициализировать переменную с 0, увеличиваем его для каждого подразделения, а затем распечатать его на стандартный вывод:

int i = 2; 
    while (n > 1) { 
     if (n % i == 0) { 
      System.out.print(" " + i); 
      int p = 0; 
      while (n % i == 0) { 
       n /= i; 
       p++; 
      } 
      System.out.print("^"+p); 
     } 
     i++; 
    } 

Если n = 98 печатает 2^1 7^2.

Смежные вопросы