2016-11-05 23 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