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

how to find whether the given number is a factorial of some number or not?

汤姆教他的学生求一个数的阶乘。他想测试学生的理解力。为此,他提供了一个数字。他想让学生告诉他这个数是哪个数的阶乘。

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

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

示例输入 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")
}

在执行这个程序时,它没有显示非阶乘的预期结果 numbers.like 示例输出 3 我无法得到它。

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

我将重点关注您逻辑中的错误:

你正在进行int除法,将输入的数字除以2,3,...,n,直到所有这些除法的结果都变成n,此时你可能会得出结论,原来的输入是 n 的阶乘。

  • 首先,如果输入不是阶乘,您没有可以跳出循环的逻辑。如果 m <= x,您应该完成循环,然后仅当 m == x 时才说输入是阶乘。

  • 其次,由于整数除法,您可能会误报。比如你从7开始,除以2,得到3,然后你发现3是循环的下一个指标,于是跳出循环,得出7是阶乘的错误结论。仅当 m % x == 0 时才应执行除法。否则,你知道输入不是阶乘,你可以跳出循环。

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

我觉得简单直观的方法是从1开始计算阶乘,直到阶乘值超过input.while你计算阶乘如果阶乘值等于你检查的数字,你就找到了。否则它不是完美的阶乘。

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。而且它不处理整数溢出。