如何查找给定数字是否是某个数字的阶乘?
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。而且它不处理整数溢出。
汤姆教他的学生求一个数的阶乘。他想测试学生的理解力。为此,他提供了一个数字。他想让学生告诉他这个数是哪个数的阶乘。
示例:如果汤姆提供的数字是 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。而且它不处理整数溢出。