查找n是否是Java中的因子数

时间:2017-11-03 15:56:21

标签: java factorial

我试图找出n是否是一个阶乘数,但我认为我的代码在循环中是错误的:)

static boolean fatorial(int n){

    for (int a = 2; a < n; a = a * (a+1)){
        if (n/a == 1){
            return true;
        }
    }
    return false;
}

2 个答案:

答案 0 :(得分:4)

a = a *(a + 1)将从a = 2开始然后a = 2 * 3 = 6然后a = 6 * 7 = 42 ..

static boolean fatorial(int n){
    long res = 1;
    int i = 2;
    while(res < n) {
       res = res * i++;
    }
    return res == n; // if res == n that means n was a factorial (res is always a factorial)
}

答案 1 :(得分:2)

您可以将其写为:

for (int a = 2; n % a == 0; n /= a++) {}
return n == 1;

如果空的for循环体让你感到不舒服:

int a = 2;
while (n % a == 0) {
  n /= a;
  a++;
}
return n == 1;

解释:

  • 检查n是否可以被a整除,其值为2,3,4,5 ......
  • 如果它不能被该数字整除,n首先不是一个因子
  • 如果它可以整除,请将n除以该数字(这样您就不会在后续检查(*)中再次计算这些因素),并增加a

如果最后n == 1,你没有提前打破循环,这最初是一个因子。

(*)例如,600 = 2*3*4*5*5不是阶乘,但由于2*3,它可以被6整除。在你发现它可以被这些方法整除之后除以2和3你不会意外地再计算它。