2015-10-16 4 views
-2

Я пытаюсь написать программу, которая дает результат как простое разложение заданного числа. Тем не менее, мой код дает правильный ответ в виде вывода "2**2**2**2**2**5**7**7**11*", но я хочу, чтобы его конкретный вывод был "(p1**n1)(p2**n2)...(pk**nk)". Вот мой код:Prime Factors in JAVA

public class PrimeDecomp 
{ 
    public static String factors(int n) 
    { 
     String ans = ""; 
     for (int i = 2; i <= n; i++) 
     { 
      if (n % i == 0) 
      { 
       // checks if i is a divisor of num 
       ans += i + "**"; 
       // writes i in prime factorization 
       n = n/i; 
       // since it is written down, num=num/i 
       i--; 
       // just in case their are multiple factors of same number. 
       // For example, 12=2*2*3 
      } 
     } 
     return (ans.substring(0, ans.length() - 1)); 
    } 

    public static void main(String[] args) 
    { 
     System.out.println(PrimeDecomp.factors(86240)); 
    } 
} 
+0

/* общественный класс PrimeDecomp { \t \t общественные статические факторы String (Int N) { \t \t \t \t String ans = ""; \t \t для (INT I = 2; г <= п; я ++) { \t \t, если (п% я == 0) {// проверяет, является ли я есть делитель NUM \t \t ANS + = I + «** «; // пишет i в простой факторизации \t \t n = n/i; // поскольку это записано, num = num/i \t \t i--; // на всякий случай, если они являются множественными факторами одного и того же числа. Так, например, 12 = 2 * 2 * 3 \t \t} \t \t} \t \t возврата (ans.substring (0, ans.length() - 1)); } \t public static void main (String [] args) { \t \t System.out.println (PrimeDecomp.factors (86240)); \t} } */ –

+3

Возможно, вы заметили, что комментарии не форматируют код очень хорошо. Вам нужно отредактировать свой вопрос и добавить свой код. – azurefrog

+2

Убедитесь, что вы [отформатируете его правильно] (http://stackoverflow.com/editing-help) тоже, пожалуйста. – tnw

ответ

0

Вы почти получили, вместо вычисления одного фактора, в то время, вычислить все для того же фактора и сосчитать их:

public static String factors(int n) 
{ 
    String ans = ""; 
    int count = 0; 
    for (int i = 2; i <= n; i++) 
    { 
     // Reset the counter 
     count = 0; 

     /* 
     * Instead of only processing on factor, we process them all and 
     * count them 
     */ 
     while (n % i == 0) 
     { 
      count++; 
      n = n/i; 
     } 

     // If we have at least processed one add it to the string 
     if (count == 1) 
     { 
      ans += "(" + i + ")"; 
     } else if (count > 0) 
     { 
      ans += "(" + i + "**" + count + ")"; 
     } 
    } 
    return ans; 
} 

Поскольку вы манипулируете строку довольно часто в цикле, вы должны использовать StringBuilder

+0

Что делать, если это 1 раз и только число не раз 1? Например: {(2 ** 5) (5 ** 1) (7 ** 2) (11 ** 1)}, и я хочу, чтобы он был {{2 ** 5) (5) (7 ** 2) (11)}. –

+0

Добавьте if, если else, первые проверки для count == 1, другие для count> 0. В count == 1 вы просто добавляете номер в строку, подобную ans + = "(" + I + ")"; –