【问题标题】:how to find whether the given number is a factorial of some number or not?如何查找给定数字是否是某个数字的阶乘?
【发布时间】:2020-04-15 07:56:43
【问题描述】:

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

示例:如果汤姆提供的数字是 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 我无法得到它。

【问题讨论】:

  • 你的问题是?
  • 请描述您面临的问题。此外,您可能还想考虑n 为 1 时会发生什么
  • 还好心问:这是什么任务吗?
  • 另外你的代码是无效的:else 缺少它的if
  • 确定这不是学习作业? ;)

标签: java factorial


【解决方案1】:

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

我将专注于你的逻辑错误:

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

  • 首先,如果输入不是阶乘,则没有逻辑会跳出循环。如果 m

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

【讨论】:

  • 或者不用除法,他/她可以简单地从 2 开始相乘。如果结果通过输入,则没有阶乘。
  • 除非你需要小心处理溢出。
【解决方案2】:

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

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

【讨论】:

  • 没有溢出处理会导致这段代码出现误报和无限循环。
  • 这几乎是正确的,但我面临的问题是,当输入值为 1 时,它显示“不是完美的阶乘”,这是错误的,因为它应该像输出 1 一样显示,因为 1 阶乘是1
  • 这不是一个完整的答案。它不处理 1 并且计算量太大。如果 fact 大于 n,它应该跳出循环
  • @BunyaminCoskuner 添加了边缘案例。当 for 循环中的 fact 大于 n 时,循环将中断
  • 它唯一不处理的是整数溢出。
猜你喜欢
  • 2020-01-28
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2016-12-28
  • 1970-01-01
相关资源
最近更新 更多