用 C 语言化简分数(最大公约数法)

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用C语言编程中的最大公约数(GCD)算法来化简分数。本实验涵盖以下步骤:从用户输入中读取分子和分母,计算最大公约数,然后将分子和分母都除以最大公约数以获得化简后的分数。本实验旨在帮助你理解分数化简的概念,并使用C编程技术来实现它。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/variables("Variables") c/BasicsGroup -.-> c/operators("Operators") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-435194{{"用 C 语言化简分数(最大公约数法)"}} c/operators -.-> lab-435194{{"用 C 语言化简分数(最大公约数法)"}} c/math_functions -.-> lab-435194{{"用 C 语言化简分数(最大公约数法)"}} c/user_input -.-> lab-435194{{"用 C 语言化简分数(最大公约数法)"}} c/output -.-> lab-435194{{"用 C 语言化简分数(最大公约数法)"}} end

读取分子和分母

在这一步中,你将学习如何在一个用于分数化简的C程序中从用户输入读取分子和分母。

首先,让我们为我们的分数化简程序创建一个新的C文件:

cd ~/project
nano fraction_simplify.c

现在,添加以下代码来读取分子和分母:

#include <stdio.h>

int main() {
    int numerator, denominator;

    printf("输入分子:");
    scanf("%d", &numerator);

    printf("输入分母:");
    scanf("%d", &denominator);

    printf("分子:%d\n", numerator);
    printf("分母:%d\n", denominator);

    return 0;
}

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

gcc fraction_simplify.c -o fraction_simplify
./fraction_simplify

示例输出:

输入分子:12
输入分母:18
分子:12
分母:18

代码解释:

  • scanf() 用于从用户读取整数输入
  • %d 是整数的格式说明符
  • &numerator&denominator 传递内存地址以存储输入值
  • printf() 用于显示输入的分子和分母

计算最大公约数并进行除法运算

在这一步中,你将实现最大公约数(GCD)算法,并使用它来化简分数。

让我们修改之前的程序,添加一个计算GCD的函数:

cd ~/project
nano fraction_simplify.c

用以下实现更新代码:

#include <stdio.h>

// 使用欧几里得算法计算GCD的函数
int computeGCD(int a, int b) {
    // 确保为正值
    a = (a > 0)? a : -a;
    b = (b > 0)? b : -b;

    // 欧几里得算法
    while (b!= 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }

    return a;
}

int main() {
    int numerator, denominator, gcd;

    printf("输入分子:");
    scanf("%d", &numerator);

    printf("输入分母:");
    scanf("%d", &denominator);

    // 计算GCD
    gcd = computeGCD(numerator, denominator);

    // 化简分数
    int simplified_numerator = numerator / gcd;
    int simplified_denominator = denominator / gcd;

    printf("原分数:%d/%d\n", numerator, denominator);
    printf("化简后的分数:%d/%d\n", simplified_numerator, simplified_denominator);

    return 0;
}

编译并运行程序:

gcc fraction_simplify.c -o fraction_simplify
./fraction_simplify

示例输出:

输入分子:12
输入分母:18
原分数:12/18
化简后的分数:2/3

代码解释:

  • computeGCD() 实现了欧几里得算法来找到最大公约数
  • 该函数处理正数和负数
  • 通过将分子和分母都除以它们的最大公约数来化简分数
  • 处理诸如零和负数等边界情况

打印化简后的分数

在这一步中,你将增强分数化简程序,以处理各种输入场景并提供清晰的输出格式。

让我们更新程序,以包含更强大的分数打印功能:

cd ~/project
nano fraction_simplify.c

用以下实现更新代码:

#include <stdio.h>

// 使用欧几里得算法计算GCD的函数
int computeGCD(int a, int b) {
    a = (a > 0)? a : -a;
    b = (b > 0)? b : -b;

    while (b!= 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }

    return a;
}

// 用于打印分数并处理特殊情况的函数
void printFraction(int numerator, int denominator) {
    // 处理除以零的情况
    if (denominator == 0) {
        printf("错误:不允许除以零。\n");
        return;
    }

    // 计算GCD
    int gcd = computeGCD(numerator, denominator);

    // 化简分数
    int simplified_numerator = numerator / gcd;
    int simplified_denominator = denominator / gcd;

    // 处理符号
    if (simplified_denominator < 0) {
        simplified_numerator = -simplified_numerator;
        simplified_denominator = -simplified_denominator;
    }

    // 打印结果
    printf("原分数:%d/%d\n", numerator, denominator);

    // 整数和分数的不同输出
    if (simplified_denominator == 1) {
        printf("化简后的分数:%d\n", simplified_numerator);
    } else {
        printf("化简后的分数:%d/%d\n",
               simplified_numerator, simplified_denominator);
    }
}

int main() {
    int numerator, denominator;

    printf("输入分子:");
    scanf("%d", &numerator);

    printf("输入分母:");
    scanf("%d", &denominator);

    // 调用分数打印函数
    printFraction(numerator, denominator);

    return 0;
}

编译并运行程序:

gcc fraction_simplify.c -o fraction_simplify
./fraction_simplify

示例输出:

输入分子:12
输入分母:18
原分数:12/18
化简后的分数:2/3

输入分子:15
输入分母:5
原分数:15/5
化简后的分数:3

输入分子:-12
输入分母:18
原分数:-12/18
化简后的分数:-2/3

代码解释:

  • 添加了 printFraction() 函数来处理分数打印
  • 处理诸如除以零之类的特殊情况
  • 管理化简后分数的符号
  • 当分母为1时打印整数
  • 保留分数的原始符号

总结

在本实验中,你将学习如何从用户输入中读取分子和分母,使用欧几里得算法计算最大公约数(GCD),然后通过将分子和分母都除以最大公约数来化简分数。化简后的分数将作为输出打印出来。

关键步骤如下:1)从用户输入中读取分子和分母,2)实现GCD算法以找到最大公约数,3)将分子和分母都除以最大公约数以获得化简后的分数。