2016-11-05 29 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可以被i整除,你會在哪裏減少n?你也應該從2開始** i **。 –

回答

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除以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