我不会写这个阶乘代码

I cant write this factorial codes

我对此有些疑问。我正在尝试学习 C 编程。请帮助我

#include<stdio.h>


int main()
{
    int a, factorial;

    printf("Please enter a value :" );

    scanf("%d", &a);


    for (int i = 1; i<=a; i++) 
    {
        a = (a - 1)*a;
    }
    printf("%d", factorial);
    return 0;
}

您正在修改输入 a 而不是 factorial 并且也是错误的(未定义的行为),因为您使用的是未初始化的 factorial。您只需要使用您声明的 factorial 变量。

int factorial = 1;
...

for (int i = 1; i<=a; i++) {
  factorial = i*factorial;
}

编辑:

此外,请注意 C 的 int 只能保存有限的值。因此,超过一定数量(大约在 13 之后!如果 sizeof(int) 是 4 个字节),您将导致 integer overflow。 您可能需要查看 GNU bugnum library 来处理大阶乘值。

您的 for 循环正在使用您的变量 'a' 而不是阶乘变量,我尝试这样的事情

factorial = 1;
for (int i = 1; i<=a; i++) 
{
    factorial *= i;
}

您必须将阶乘初始化为 1,然后 for 循环将继续乘以 'i',直到 'i' 大于 'a'。

好吧,在您的代码行 a = (a - 1)*a; 中,您实际上更改了输入以获取阶乘。它也会破坏你的循环。只要您的 i 小于 a,您的 for 循环就会继续,假设您在第一次迭代后选择 a=3a 本身将变为 6 ,因此 for 循环将继续,直到达到整数限制,您将得到溢出错误。

你应该做什么?

首先,您应该使用第二个变量来存储阶乘结果,您将其引入为 factorial,@danielku97 所说的方式是编写阶乘的好方法,因为如果您将 0 表示为输入它也会给出正确的结果 1。所以一个好的代码是:

factorial = 1;
for (int i = 1; i<=a; i++) 
{
    factorial *= i;
}

但是假设你坚持减法,你刚刚尝试使用的方式,那么你需要像这样更改代码:

scanf("%d", &a);
if (a==1 || a==0){
    printf("1");
    return 0;
}

factorial = a;
for (int i = 1; i<a; i++) 
{
factorial *= (a - i)*factorial;
}

您可以看到代码变得不必要地长了。包含一个 if 以更正 10 的结果。此外,您还需要确保 i 永远不会变得像 i =a 那样,因为在那种情况下 a-i 将等于零并使阶乘结果等于零。

我希望这些解释可以帮助你更快地学习 C 和算法。