在Java中查找n是否为阶乘数

在Java中查找n是否为阶乘数,java,factorial,Java,Factorial,我试图找出n是否是一个阶乘数,但我认为我的代码在循环中是错误的: static boolean fatorial(int n){ 对于(int a=2;a

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

static boolean fatorial(int n){
对于(int a=2;a
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)
}
static boolean fatorial(int n){
长res=1;
int i=2;
while(res
您可以这样写:

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
不是阶乘,但它可以被6整除,因为
2*3
。当你发现它可以被2和3整除后,你就不会意外地再次计算它。

什么是“阶乘数”?你是说斐波那契?a的值是2,6,42。。。a=a*(a+1)是错误的,你期望得到什么结果,得到什么结果?(对于不同的n)?
For(inta=2;n%a==0;n/=a++){}返回n==1。你不需要增加
i
?@Vasan错过了!易于理解,可能比使用除法更快,而且不需要整数除法+1@AndyTurner我不明白你的意思。1932053505不是阶乘,程序返回false。溢出在哪里?@mehulmpt道歉-我没有发现你在使用
长分辨率
;不会因此而溢出。忽略1932053505,我在复制一些输出时没有考虑它。
int a = 2;
while (n % a == 0) {
  n /= a;
  a++;
}
return n == 1;