如何找到给定的数字是否是某个数字的阶乘?

问题描述 投票:-1回答:2

汤姆教他的学生找到一个数字的阶乘。他想测试学生的理解。为此,他提供了一个电话号码。他希望学生告诉他这个数字是哪个数字的阶乘。

[示例:如果汤姆提供的数字为120,则学生应回答5,因为5! = 120。

通过编写程序来帮助学生做到这一点。请注意,输入的数字应大于零。如果输入小于或等于零,则输出应为“无效输入”。同样,如果提供的输入不完全是数字的阶乘,例如,提供的输入是122,这不是数字的理想阶乘,则它应返回“对不起。给定的数字不是一个完美的阶乘”。

样本输入1:5040样本输出1:7

样本输入2:0样本输出2:无效输入

样本输入3:700样本输出3:抱歉。给定的数字不是一个完美的阶乘]

public static void main(string[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=n;
if (n<=0){
System.out.println("Invalid Input");
return;
}
for(int x=2;m!=x;x++)
{
m=m/x;
}
System.out.println(m);
}
else
System.out.println("the given number is not a perfect factorial")
}

[执行此程序时,它不会显示非阶乘数的预期结果。就像样本输出3 i无法获得它。

java factorial
2个回答
0
投票

您的代码中有很多编译错误。

我认为简单直观的方法是从1开始计算阶乘,直到阶乘值超过输入。在计算阶乘时,如果阶乘值等于要检查的数字,则会找到它。否则它不是一个完美的阶乘。

public static void main( String[] args )
{
    Scanner sc = new Scanner( System.in );
    int n = sc.nextInt();
    if ( n <= 0 ) {
        System.out.println( "Invalid Input" );
        return;
    }
    int fact = 1;
    boolean found = false;
    int i = 2;
    for ( ; fact < n; i++ ) {
        fact *= i;
        if ( fact == n ) {
            System.out.println( i );
            found = true;
            break;
        }
    }
    if ( n == 1 ) {
        System.out.println( 1 );//handle edge case
        found = true;
    }
    if ( !found ) {
        System.out.println( "the given number is not a perfect factorial" );
    }
}

编辑:我们需要单独处理边缘盒1。而且它不处理整数溢出。


2
投票

我不确定您的代码是否甚至通过了编译(看起来好像有一个else子句,最后没有相应的if)。

我将关注您的逻辑错误:

您正在执行int除法,将输入数字除以2、3,...,n,直到所有这些除法的结果变为n,此时您可能会得出以下结论:原始输入是n的阶乘。

  • 首先,如果输入不是阶乘,则没有逻辑会跳出循环。如果m <= x,则应完成循环,然后说只有m == x时,输入才是阶乘。

  • 首先,由于int除法,您可能会得出假阳性。例如,如果您从7开始并除以2,则得到3。然后您发现3是循环的下一个索引,因此您跳出循环并得出错误的结论,认为7是阶乘。仅当m % x == 0时才应执行除法。否则,您知道输入不是阶乘,则可以跳出循环。

© www.soinside.com 2019 - 2024. All rights reserved.