c中的阶乘程序

Factorial program in c

正在尝试编写一个代码来获取输入数字的阶乘。

int factorial(int number, int i)
{
    int endval;
    for(i = number - 1; i>0; i--){
        endval = number * i;
    }
    if (endval == 0){
        printf("1");
    }
    return endval;
}

int main()
{
    int endvalue, numA, numB;
    char userchoice[1];
    printf("Enter a choice to make (f for factorial): \n");
    scanf("%s", userchoice);
    if(strcmp(userchoice, "f")== 0){
        printf("Enter a value to get it's factorial: ");
        scanf("%d", &numA);
        endvalue = factorial(numA, numB);
        printf("%d", endvalue);
        return 0;}


    getch();
    return 0;
}

出于某种原因,当我设置答案 (number*i)= endval 时,整个 for 循环在函数中没有执行任何操作。它只是打印出我输入的相同数字,并给了我一个荒谬的答案0!

int factorial(int number, int i)
{
    int endval;
    for(i = number - 1; i>0; i--){
            endval = number * i;
    }
    if (endval == 0){
        printf("1");
    }
    return endval;
}

然而,当我完全删除 endval 变量时代码工作得很好(除了它得到 0!= 10)

int factorial(int number, int i)
{
    for(i = number - 1; i>0; i--){
        number = number * i;
    }
    if (number == 0) {printf("1");}
    return number;
}

代码中是否遗漏了导致这些错误的任何内容?

可能需要更正的地方很少。请参阅附件代码。



    int factorial(int number)
    {
    
        if (number == 0){ return 1; }
    
        int endval=1, i;
    
        for(i = 1; i<=number; i++) { endval *= i; }
    
        return endval;
    
    }
    
    int main() {
    
        int endvalue, numA;
        char userchoice[1];
        printf("Enter a choice to make (f for factorial): \n");
        scanf("%s", userchoice);
    
        if(strcmp(userchoice, "f")== 0) {
    
            printf("Enter a value to get it's factorial: ");
            scanf("%d", &numA);
            endvalue = factorial(numA);
            printf("%d", endvalue);
            return 0;
    
        }
    
    getch();
    return 0;
    }

#include <stdio.h>
#include <string.h>

int factorial(int number)
{
    int endval=1;
    for(int i = number ; i>0; i--){
        endval *= i;
    }
    return endval;
}

int main()
{

    int endvalue=0;
    int numA=0;

    char userchoice[1];
    printf("Enter a choice to make (f for factorial): ");
    int ret=scanf("%s", userchoice);
    if (!ret){
        printf("Error in scanf: %d", ret);
    }
    if(strcmp(userchoice, "f")== 0){
        printf("Enter a value to get it's factorial: ");
        scanf("%d", &numA);
        endvalue = factorial(numA);
        printf("%d", endvalue);
        return 0;
    }

    getchar();
    return 0;
}

稍作修改的代码将有效

  • factorial()函数只能获取一个参数。
  • 作为一个好习惯,所有变量都必须初始化。
  • 将 include 语句添加到源代码中并明确表示不依赖编译器。 当我们使用 strcmp() 时,我们必须包括 string.h
  • 使用标准 getchar() 而不是 getch()
  • 也可以检查return库函数scanf()的值,以确保读取正确。
  • 您可以使用编译器的警告来获取上述大部分注释。在 gcc 中:gcc -Wall code.c
  • 使用调试器 运行 逐行编程并监控每个步骤中的变量值,或者使用尽可能多的 printf() 查看函数调用中发生的情况。

阶乘的定义是:
阶乘(0) = 1
阶乘(n) = n * 阶乘(n-1)
注意:阶乘仅对数字 >= 0

合法

在 C 中,这个定义是:

 int factorial(int number)
    {
         if (number < 0)
             return -1;

         if (number == 0)
              return (1);
    
         /*else*/
         return (number * factorial(number-1));
    }