我试图找出n是否是一个阶乘数,但我认为我的代码在循环中是错误的:)
static boolean fatorial(int n){
for (int a = 2; a < n; a = a * (a+1)){
if (n/a == 1){
return true;
}
}
return false;
}
答案 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你不会意外地再计算它。