在Java中查找n是否为阶乘数
我试图找出n是否是一个阶乘数,但我认为我的代码在循环中是错误的:在Java中查找n是否为阶乘数,java,factorial,Java,Factorial,我试图找出n是否是一个阶乘数,但我认为我的代码在循环中是错误的: static boolean fatorial(int n){ 对于(int a=2;a
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
整除,其值为2,3,4,5a
- 如果它不能被这个数字整除,
一开始就不是阶乘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;