当前位置: 首页 > 知识库问答 >
问题:

如何确定给定的数是否是某个数的阶乘?

邵锐
2023-03-14

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

示例:如果Tom提供的数字为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")
}

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

共有2个答案

皇甫琛
2023-03-14

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

我觉得简单直观的方法是从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。它不处理整数溢出。

苏洛城
2023-03-14

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

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

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

>

其次,由于int除法,可能会出现误报。例如,如果你从7开始,除以2,得到3。然后你发现3是循环的下一个索引,所以你跳出了循环,得出了错误的结论,7是阶乘。只有当m%x==0时,才应执行除法。否则,您知道输入不是阶乘,您可以跳出循环。

 类似资料:
  • 所以我有一个问题,当我计算一个数字时,比如说15,我必须显示这个:15=3x5,但我得到的是3x5x5,我不知道如何使它变成这样,所以它只显示3x5。还有一个问题是,我输入的数字是否是素数。有办法解决这个问题吗?我只需要这些,然后再编辑其他东西。

  • 问题内容: 好的,我的问题不是如何确定数字是否为质数,因为我想我已经知道了,但是更多的是如何使其正确显示。 这是我的代码: 现在我的问题是,如果数字最终等于9,它会说它是质数,而不是。我认为问题在于中断在一个循环后就停止了它,因此它不会递增变量p,因此仅测试除以2(我认为)。但是,如果我删除断点,它将在每次通过时打印出“和不是素数”,直到退出循环为止。不知道该怎么办。 问题答案: 查找数字是否为素

  • 问题内容: 当我输入时,它给出以下输出。 从中我如何知道给定的操作系统是32位还是64位? 这在编写脚本时非常有用,例如:我要为哪种体系结构构建? 问题答案: 尝试。缺少它并输出: 否则,请键入以下内容 ,而不是Linux内核,而是CPU : 要么: 在“标志”参数下,您将看到各种值:请参阅“ / proc / cpuinfo中的标志是什么意思? ”其中一个名为:(x86-64:amd64,也称为

  • 检查给定的数字是否在给定范围内。 使用算术比较来检查给定的数字是否在指定的范围内。如果没有指定第三个参数 end ,则范围被认为是从 0 到 start 。 const inRange = (n, start, end = null) => { if (end && start > end) end = [start, (start = end)][0]; return end == nu

  • 问题内容: 我有一个像 如何检查此数组以查看Magenic是否存在?除非必须,否则我不想循环播放。我正在处理几千条记录。 更新 由于这是一个受欢迎的帖子,所以我想分享一些新发现。看来@CAFxX已经分享了!我应该更经常阅读这些内容。 借助 ECMAScript 2015 ,使用新的箭头功能甚至更加简单: 问题答案: 2018 edit :这个答案来自2011,当时浏览器没有广泛支持数组过滤方法和箭