Java中非特权因素的数量

时间:2016-09-01 08:11:04

标签: java factors

我有一个问题要检查总计数是否等于该数字的任何因素。我在JAVA编程的学习阶段。问题如下:

*

  

Bishal数是一个非平凡因子的数量   是数字的一个因素。例如,6是Bishal数,因为6   有两个非平凡因素:2和3.(非平凡因素是一个因素   除了1和数字)。因此,6有两个非平凡因素。现在,   2是因子6.因此,非平凡因素的数量是一个因素   因此,6是Bishal数。另一个Bishal数字是30因为   30有2,3,5,6,10,15作为非平凡因素。因此30有6   非平凡因素。注意6是30的因子。所以30是Bishal   数。然而,21不是Bishal数字。非平凡因素   21是3和7.因此,非平凡因素的数量是2.注意   2不是因子21.因此,21不是Bishal数。写   一个名为isBishal的函数,如果其整数参数为a,则返回1   Bishal数,否则返回0.
  功能的签名   是int isBishal(int n)

*

我可以创建一个功能。但我不知道如何用因子检查总数。我的解决方案的某些部分如下所示:

public static int isBishal(int n){
   int count=0;   //for number of factor of entered number n  
   for (int i=2; i<n; i++){ //for excluding 1 and itself in factors list
            double result=(double)n/i;
            if(result==Math.ceil(result)){
                int factor=(int) result; //to check factor(one can use reminder 0 case)
                count++;
            } //closing if clause
      } //closing for loop

我在哪里可以将最终计数(即因子总数)与任何因子进行比较?如果我使用因子等于计数,则计数从1,2,3开始,依此类推。并且它可以将计数1,2,3左右与因子进行比较。我需要比较最终计数。所以我把数量排除在外。但是因子的范围恰好在if子句中。它无法在外循环中进行比较。

有人请在这个程序中告诉我.P.S:这个程序不完整因为我无法比较。

5 个答案:

答案 0 :(得分:5)

您必须存储您找到的因素,以检查非平凡因素的数量是否是一个因素。

例如,您可以使用HashSet

public static boolean isBishal(int n) { // I changed the return type to boolean
    int count=0; 
    Set<Integer> factors = new HashSet<>();
    for (int i=2; i<n; i++){
        if (n % i == 0) { // note this is a simpler way to check if i is a factor of n
            factors.add(i);
            count++;
        }
    }
    return factors.contains(count);
}

编辑:正如khelwood所建议的那样,如果countn的因素,那么存储因子的替代方法是在循环结束时进行检查:

public static boolean isBishal(int n) { 
    int count=0; 
    for (int i=2; i<n; i++){
        if (n % i == 0) {
            count++;
        }
    }
    return (count > 1) && (n % count == 0);
}

答案 1 :(得分:2)

我会尽力指导你。

public static int isBishal(int n){

   int count = 0;  
   for (int i = 2; i < n; i++){      

        if(n % i == 0) {
            // TODO: We found a factor, insert it in some data structure e.g. in stack or (resizable) array          
            count++;
        }

   } 

  // TODO: loop through the array (or data structure you used) where you stored factors, and check if any of them matches count.
  //       If none of them match count, return 0, otherwise 1.

}

答案 2 :(得分:2)

你开始的方式有几点。

首先:不要使用double来操作整数。要知道数字是否是另一个数的除数,请使用余数运算符%(如果A % B == 0BA的除数。

第二:你不仅需要知道一个数字是否为除数,而且还需要保持它。您可以使用Set来保存所有除数。将它添加到if子句中。

第三:如果将除数保存在Set中,则不需要计数变量来知道存在多少除数。只需计算除数集中的元素。

第四:一旦你得到了除数,你就可以简单地遍历除数,检查是否有一个除数,其值等于除数的数量。

以下是代码:

public static int isBishal(int n){
   Set<Integer> factors = new HashSet<>();  // Create a Set for factors 
   for (int i = 2; i < n; i++) { 
       if (n % i == 0) {   // CHeck if i is factor of n using %
           factors.add(i);  // If i is a factor add it to factors
       }
   }
   if (factors.contains(factors.size())) {
        return 1;   // If a factor is equal to the number of factors return 1
   }
   return 0;   // If none factor equals number of divisors return 0
}

附加说明:可以进行其他优化。例如,不需要从2循环到n - 1.在n / 2 + 1和n - 1之间不能存在除数,因此您可以使用以下条件重写第一个循环:

for (int i = 2; i <= (n / 2) + 1; i++) {

答案 3 :(得分:0)

public static boolean isBishal(int n) {
    long factors = IntStream.rangeClosed(2, n/2)
            .filter(x -> n % x == 0)
            .count();
    return factors != 0 
           && n % factors == 0;
}

n的所有非平凡因素都在[2, n/2]范围内。 这里我们filter整数来自范围的谓词,然后是count

答案 4 :(得分:0)

public class Demo{
public static void main(String[] args) {
    System.out.println("Result: " + isBishal(21));
}

public static int isBishal(int n) {
    int countFactors = 0;
    int flag = 0;// False case
    for (int i = 2; i < n; i++) {
        if (n % i == 0) {
            countFactors++;
        }
    }
    if (n % countFactors == 0) {
        flag = 1;// True case
    }
    return flag;
}

}