用 C 语言计算阶乘

CBeginner
立即练习

简介

在本实验中,你将学习如何用 C 语言编程计算阶乘。本实验涵盖了两种计算数字阶乘的方法:使用迭代循环和递归函数。你将首先从用户那里读取一个整数输入,然后实现基于循环和递归的方法来计算阶乘,最后打印结果。

本实验提供了逐步的指导和代码示例,以引导你完成整个过程,确保你全面理解 C 语言中的阶乘计算。

读取整数 n

在这一步中,你将学习如何在 C 程序中读取一个整数输入,以便计算其阶乘。我们将专注于创建一个简单的程序,提示用户输入一个数字并存储它以供进一步计算。

首先,让我们在项目目录中创建一个新的 C 文件:

cd ~/project
nano factorial.c

现在,添加以下代码来读取整数输入:

#include <stdio.h>

int main() {
    int n;

    printf("Enter a number to calculate its factorial: ");
    scanf("%d", &n);

    printf("You entered: %d\n", n);

    return 0;
}

让我们编译并运行该程序:

gcc factorial.c -o factorial
./factorial

示例输出:

Enter a number to calculate its factorial: 5
You entered: 5

在这段代码中:

  • printf() 用于向用户显示提示信息
  • scanf() 从用户读取整数输入
  • %d 是整数的格式说明符
  • &nn 变量的内存地址传递过去以存储输入

使用循环或递归计算 n!

在这一步中,你将学习两种计算数字阶乘的方法:使用迭代循环和递归函数。我们将修改之前的 factorial.c 文件来实现这两种方法。

让我们更新 factorial.c 文件:

cd ~/project
nano factorial.c

添加以下代码以使用循环和递归实现阶乘计算:

#include <stdio.h>

// 使用迭代循环计算阶乘
unsigned long long factorialLoop(int n) {
    unsigned long long result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

// 使用递归计算阶乘
unsigned long long factorialRecursive(int n) {
    if (n == 0 || n == 1) {
        return 1;
    }
    return n * factorialRecursive(n - 1);
}

int main() {
    int n;

    printf("Enter a number to calculate its factorial: ");
    scanf("%d", &n);

    if (n < 0) {
        printf("Factorial is not defined for negative numbers.\n");
        return 1;
    }

    printf("Factorial using loop: %llu\n", factorialLoop(n));
    printf("Factorial using recursion: %llu\n", factorialRecursive(n));

    return 0;
}

编译并运行程序:

gcc factorial.c -o factorial
./factorial

示例输出:

Enter a number to calculate its factorial: 5
Factorial using loop: 120
Factorial using recursion: 120

此实现中的关键点:

  • unsigned long long 用于处理较大的阶乘值
  • 循环方法使用 for 循环来相乘数字
  • 递归方法使用 n - 1 调用自身,直到达到基例
  • 添加了对负数的错误处理
  • 两种方法产生相同的结果

打印阶乘

在这一步中,你将改进阶乘计算程序,以提供更详细的输出并处理不同的输入场景。我们将修改 factorial.c 文件,以改进阶乘结果的展示。

更新 factorial.c 文件:

cd ~/project
nano factorial.c

用以下改进后的实现替换之前的内容:

#include <stdio.h>

unsigned long long factorialLoop(int n) {
    unsigned long long result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

void printFactorialDetails(int n, unsigned long long factorial) {
    printf("阶乘计算详情:\n");
    printf("数字 (n):%d\n", n);
    printf("阶乘 (n!):%llu\n", factorial);

    printf("阶乘展开式:");
    for (int i = 1; i <= n; i++) {
        printf("%d%s", i, (i < n)? " × " : " = ");
    }
    printf("%llu\n", factorial);
}

int main() {
    int n;

    printf("请输入一个非负整数以计算其阶乘:");
    scanf("%d", &n);

    if (n < 0) {
        printf("错误:负数没有阶乘定义。\n");
        return 1;
    }

    if (n > 20) {
        printf("警告:大数的阶乘可能会导致整数溢出。\n");
    }

    unsigned long long result = factorialLoop(n);
    printFactorialDetails(n, result);

    return 0;
}

编译并运行程序:

gcc factorial.c -o factorial
./factorial

示例输出:

请输入一个非负整数以计算其阶乘:5
阶乘计算详情:
数字 (n):5
阶乘 (n!):120
阶乘展开式:1 × 2 × 3 × 4 × 5 = 120

此版本的主要改进:

  • 添加了详细的 printFactorialDetails() 函数
  • 显示完整的阶乘展开式
  • 包含对大数的警告
  • 提供清晰、信息丰富的输出

总结

在本实验中,你学习了如何从用户那里读取整数输入,并使用迭代循环和递归函数来计算其阶乘。你探索了创建一个 C 程序的过程,该程序提示用户输入一个数字,处理负输入,并输出阶乘结果。本实验涵盖了读取用户输入、实现阶乘计算算法以及打印最终结果的关键步骤。