为什么我的 CheckFactorial 脚本不起作用?
Why is my CheckFactorial script not working?
#include <stdio.h>
int checkiffactorial();
int factorial(int n);
int number;
int main()
{
int answer, n, i;
printf("Enter a number: ");
scanf("%d", &number);
answer = checkiffactorial();
if (answer == 1)
{
printf("It's a factorial");
}
else
{
printf("It's not a factorial");
}
}
int checkiffactorial()
{
static int whichnumber = 1;
int currnumber;
if (whichnumber > number)
{
return 0;
}
if(whichnumber <= number)
{
currnumber = factorial(whichnumber);
if (currnumber == factorial(number))
{
return 1;
}
whichnumber++;
checkiffactorial();
}
}
int factorial(int n)
{
int i;
int fac;
for(i=1; i<=n; ++i)
{
fac = fac * i;
}
}
为什么这段代码不起作用?
我的 C 代码旨在让您输入一个数字并检查该数字是否可以是阶乘。
例如:如果您输入 6,它应该是 Yes,因为 3! = 6 但如果您输入 8 将不起作用。
我不认为这是重复的,因为我做的方法不同。
请注意,我不太擅长 C,所以任何额外的提示都将不胜感激。
您需要更正 3 个错误才能使该程序运行。
- 您将
whichnumber
的 factorial
与 number
的 factorial
进行比较,这是错误的。
currnumber = factorial(whichnumber);
if (currnumber == factorial(number)) //<----never be true
{
return 1;
}
您应该将 whichnumber
的 factorial
与 number
进行比较
currnumber = factorial(whichnumber);
if (currnumber == number) //<----should check whether it's same with the number
{
return 1;
}
2。您应该在 factorial
函数中初始化 fac
变量,否则它会占用一些垃圾值。
int fac=1; //<-----initialize this variable
3。在计算 factorial
.
之后,您应该 return fact
的值
return fac; //<-----should return value
修改后的代码如下:
#include <stdio.h>
int checkiffactorial();
int factorial(int n);
int number;
int main()
{
int answer, n, i;
printf("Enter a number: ");
scanf("%d", &number);
answer = checkiffactorial();
if (answer == 1)
{
printf("It's a factorial");
}
else
{
printf("It's not a factorial");
}
}
int checkiffactorial()
{
static int whichnumber = 1;
int currnumber;
if (whichnumber > number)
{
return 0;
}
if(whichnumber <= number)
{
currnumber = factorial(whichnumber);
if (currnumber == number) //<----should check whether it's same with the number
{
return 1;
}
whichnumber++;
checkiffactorial();
}
}
int factorial(int n)
{
int i;
int fac=1; //<-----initialize this variable
for(i=1; i<=n; ++i)
{
fac = fac * i;
}
return fac; //<-----should return value
}
有人向您指出,您没有 return 函数中的值,而是使用未初始化的值。这些错误很容易犯,但也很容易发现:为您的编译器启用警告,它们会告诉您这些事情。
Suvojit 的回答告诉您阶乘函数有什么问题。不幸的是,您的阶乘检查还有更多问题:
- 你让你检查的数字成为一个全局变量。这实际上应该是函数的一个参数,这样你就可以像你应该的那样调用它:
is_factorial(n)
.
- 您将计数器设为
static
变量。这就像一个全局变量,但有一个限制,即它只在这个函数中已知,这意味着你不能从外部改变它。如果您的程序要检查多个数字,第二次调用会从您之前中断的地方开始,这会导致错误的结果。
- 当然这就是您在实现中想要的,因为您使用了递归算法。在这种情况下,这不是一个好的选择;使用循环。
- 您何时停止迭代(或何时中断循环)的条件是检查该数字与您对其进行阶乘的数字。您应该针对阶乘本身进行测试。
请注意,典型的 int
有 32 位,可以表示最多 2³¹ 的正值。阶乘 13!已经超过了这个限制。因此,您必须根据 12 个值检查您的数字。
您不需要为此使用阶乘函数,您可以随时构建这些值,因为 n! = (n - 1)! · n。 (你可以用阶乘函数,但是会一遍又一遍地做同样的计算,很浪费。这个玩具问题无所谓,但值得记住这样的事情。)
这是你的函数,完全重写了:
int is_factorial(int n)
{
int fact = 1;
int k = 1;
while (k < 13 && fact <= n) {
fact *= k;
if (n == fact) return k;
k++;
}
return 0;
}
当 n
不是阶乘时,它 return 是 0,否则 return 是 n
的阶乘的数字。 (这个信息反正都要用到,为什么不提供呢?调用者可以选择是使用这个信息还是直接作为真值使用。)
说到这里,让我们调整 main
函数,以便程序检查错误输入并打印出我们 return:
的额外信息
int main(void)
{
int n;
printf("Enter a number: ");
if (scanf("%d", &n) < 1) {
printf("Illegal input!\n");
} else {
int m = is_factorial(n);
if (m) {
printf("%d is the factorial of %d!\n", n, m);
} else {
printf("%d is not a factorial!\n", n);
}
}
return 0;
}
这里要注意的是,您应该使用编译器警告来告诉您有关简单错误的信息,您应该避免使用全局变量和静态变量来解决此类封闭问题,并且循环通常比递归更简单。
#include <stdio.h>
int checkiffactorial();
int factorial(int n);
int number;
int main()
{
int answer, n, i;
printf("Enter a number: ");
scanf("%d", &number);
answer = checkiffactorial();
if (answer == 1)
{
printf("It's a factorial");
}
else
{
printf("It's not a factorial");
}
}
int checkiffactorial()
{
static int whichnumber = 1;
int currnumber;
if (whichnumber > number)
{
return 0;
}
if(whichnumber <= number)
{
currnumber = factorial(whichnumber);
if (currnumber == factorial(number))
{
return 1;
}
whichnumber++;
checkiffactorial();
}
}
int factorial(int n)
{
int i;
int fac;
for(i=1; i<=n; ++i)
{
fac = fac * i;
}
}
为什么这段代码不起作用? 我的 C 代码旨在让您输入一个数字并检查该数字是否可以是阶乘。
例如:如果您输入 6,它应该是 Yes,因为 3! = 6 但如果您输入 8 将不起作用。
我不认为这是重复的,因为我做的方法不同。
请注意,我不太擅长 C,所以任何额外的提示都将不胜感激。
您需要更正 3 个错误才能使该程序运行。
- 您将
whichnumber
的factorial
与number
的factorial
进行比较,这是错误的。
currnumber = factorial(whichnumber); if (currnumber == factorial(number)) //<----never be true { return 1; }
您应该将 whichnumber
的 factorial
与 number
currnumber = factorial(whichnumber);
if (currnumber == number) //<----should check whether it's same with the number
{
return 1;
}
2。您应该在 factorial
函数中初始化 fac
变量,否则它会占用一些垃圾值。
int fac=1; //<-----initialize this variable
3。在计算 factorial
.
fact
的值
return fac; //<-----should return value
修改后的代码如下:
#include <stdio.h>
int checkiffactorial();
int factorial(int n);
int number;
int main()
{
int answer, n, i;
printf("Enter a number: ");
scanf("%d", &number);
answer = checkiffactorial();
if (answer == 1)
{
printf("It's a factorial");
}
else
{
printf("It's not a factorial");
}
}
int checkiffactorial()
{
static int whichnumber = 1;
int currnumber;
if (whichnumber > number)
{
return 0;
}
if(whichnumber <= number)
{
currnumber = factorial(whichnumber);
if (currnumber == number) //<----should check whether it's same with the number
{
return 1;
}
whichnumber++;
checkiffactorial();
}
}
int factorial(int n)
{
int i;
int fac=1; //<-----initialize this variable
for(i=1; i<=n; ++i)
{
fac = fac * i;
}
return fac; //<-----should return value
}
有人向您指出,您没有 return 函数中的值,而是使用未初始化的值。这些错误很容易犯,但也很容易发现:为您的编译器启用警告,它们会告诉您这些事情。
Suvojit 的回答告诉您阶乘函数有什么问题。不幸的是,您的阶乘检查还有更多问题:
- 你让你检查的数字成为一个全局变量。这实际上应该是函数的一个参数,这样你就可以像你应该的那样调用它:
is_factorial(n)
. - 您将计数器设为
static
变量。这就像一个全局变量,但有一个限制,即它只在这个函数中已知,这意味着你不能从外部改变它。如果您的程序要检查多个数字,第二次调用会从您之前中断的地方开始,这会导致错误的结果。 - 当然这就是您在实现中想要的,因为您使用了递归算法。在这种情况下,这不是一个好的选择;使用循环。
- 您何时停止迭代(或何时中断循环)的条件是检查该数字与您对其进行阶乘的数字。您应该针对阶乘本身进行测试。
请注意,典型的 int
有 32 位,可以表示最多 2³¹ 的正值。阶乘 13!已经超过了这个限制。因此,您必须根据 12 个值检查您的数字。
您不需要为此使用阶乘函数,您可以随时构建这些值,因为 n! = (n - 1)! · n。 (你可以用阶乘函数,但是会一遍又一遍地做同样的计算,很浪费。这个玩具问题无所谓,但值得记住这样的事情。)
这是你的函数,完全重写了:
int is_factorial(int n)
{
int fact = 1;
int k = 1;
while (k < 13 && fact <= n) {
fact *= k;
if (n == fact) return k;
k++;
}
return 0;
}
当 n
不是阶乘时,它 return 是 0,否则 return 是 n
的阶乘的数字。 (这个信息反正都要用到,为什么不提供呢?调用者可以选择是使用这个信息还是直接作为真值使用。)
说到这里,让我们调整 main
函数,以便程序检查错误输入并打印出我们 return:
int main(void)
{
int n;
printf("Enter a number: ");
if (scanf("%d", &n) < 1) {
printf("Illegal input!\n");
} else {
int m = is_factorial(n);
if (m) {
printf("%d is the factorial of %d!\n", n, m);
} else {
printf("%d is not a factorial!\n", n);
}
}
return 0;
}
这里要注意的是,您应该使用编译器警告来告诉您有关简单错误的信息,您应该避免使用全局变量和静态变量来解决此类封闭问题,并且循环通常比递归更简单。