【问题标题】:Finding factorial with C用 C 求阶乘
【发布时间】:2021-06-11 01:41:08
【问题描述】:

这里只是 C 的新手。我正在尝试使用递归和指针打印给定输入的阶乘,但是当我的输入为 5 时,输出为 2293620。有人可以帮我解决这个问题吗?我不确定这个数字是从哪里来的,因为 5 的阶乘应该给我 120。感谢您的帮助!

#include<stdio.h>


int countlength(int *num) {
    
    int x = 1;
    if (*num == 1) {
        return 1; 
    } else {
        return *num * countlength(num-1);
    }
}

int main() {

    int n, l;
    printf("Enter number: ");
    scanf("%d", &n);
    l = countlength(&n);
    printf("The factorial of %d is %d\n", n, l);
    return 0;
}

【问题讨论】:

  • countlength(num-1) 编译器应该在那里给你一个警告。那是从指针中减去,而不是从指针引用的值中减去。建议您将函数更改为采用int 参数而不是int *。无需作为指针传递,它会让您的生活更轻松。
  • 为什么将指针作为参数传递给countlength
  • 始终启用编译器的警告! (例如-Wall -Wextra -pedantic 与 gcc/clang)它会发现问题。
  • 请阅读诊断。给出它们是有原因的。

标签: c factorial


【解决方案1】:

从您的代码中删除引用。

#include<stdio.h>


int countlength(int num) {
    
    int x = 1;
    if (num == 1) {
        return 1; 
    } else {
        return num * countlength(num-1);
    }
}

int main() {

    int n, l;
    printf("Enter number: ");
    scanf("%d", &n);
    l = countlength(n);
    printf("The factorial of %d is %d\n", n, l);
    return 0;
}

【讨论】:

    【解决方案2】:

    在这种情况下,我认为您不需要使用传递引用。您应该使用按值传递。那么你的代码就可以完美运行了

    【讨论】:

      【解决方案3】:

      改变这一行:

      return num * countlength(num - 1);
      

      到这里:

      int val = *num - 1;
      return *num * countlength(&val);
      

      所以你正确地分配了值并将其作为指针传递。

      【讨论】:

        【解决方案4】:
        
        
        int countlength(int *num) {
            
            int x = *num - 1;
            if (*num == 1) {
                return 1; 
            } else {
                return *num * countlength(&x);
            }
        }
        
        int main() {
        
            int n, l;
            printf("Enter number: ");
            scanf("%d", &n);
            l = countlength(&n);
            printf("The factorial of %d is %d\n", n, l);
            return 0;
        }```
        **Try this**
        

        【讨论】:

        • My answer 也解释了同样的事情。有什么不同?
        【解决方案5】:

        int countlength(int *num) {

        if (*num == 1) {
            return 1; 
        } else {
            return *num * countlength(&(*num - 1));
        }
        

        }

        int main() {

        int n, l;
        printf("Enter number: ");
        scanf("%d", &n);
        l = countlength(&n);
        printf("The factorial of %d is %d\n", n, l);
        return 0;
        

        }

        试试这个

        【讨论】:

        • 添加一些文本来解释你的代码如何解决 OP 的问题总是好的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        相关资源
        最近更新 更多