有理数四则运算

实验内容

(1)实现两个有理数相加、相减、相乘的运算。

(2)选作内容:实现两个有理数相除的运算

假设用户输入的分母总是非零的

首先定义了一个Rational结构体来存储有理数的分子(numerator)和分母(denominator),然后提供了四个函数分别用于执行加、减、乘、除运算,并显示结果。

注意:

  1. 这个程序没有处理除法运算,因为除法运算相对复杂,需要引入除法后结果的整数部分和小数部分,且可能涉及浮点数的处理。
  2. printRational函数中,我们简单实现了约分功能,通过寻找分子和分母的最大公约数(gcd)来约分。这里使用了简单的穷举法来计算gcd,对于大数可能不够高效,但足以应对本示例的需求。
  3. 当处理有理数时,应始终确保分母不为0,尽管在这个示例中用户直接输入,实际应用中可能需要加入更严格的输入验证。
  4. 输出时,如果分母为负数,则将整个有理数取反,以确保输出的有理数总是正数或零(分子为零时)。
cs 复制代码
#include <stdio.h>  
  
// 定义有理数结构体Rational来存储有理数的分子和分母
typedef struct {  
    int numerator;   // 分子  
    int denominator; // 分母  
} Rational;  
  
// 求最大公约数(GCD)  
int gcd(int a, int b) {  
    while (b != 0) {  
        int temp = b;  //将b的值暂存到temp中
        b = a % b;  // 用a除以b的余数来更新b的值  
        a = temp;  // 将原来的b值(现在保存在temp中)赋给a 
    }  
    return a;  // 当b变为0时,循环结束,此时a即为两数的最大公约数
}  
  
// 约分函数  
void simplify(Rational *r) {  
    int g = gcd(r->numerator, r->denominator);  // 计算最大公约数
    r->numerator /= g;  // 使用整数除法简化分子
	//计算 r->numerator 除以 g 的结果,将结果赋值给 r->numerato
    r->denominator /= g;  // 使用整数除法简化分子
    // 确保分母为正  
    if (r->denominator < 0) {  
        r->numerator = -r->numerator;  // 改变分子的符号
        r->denominator = -r->denominator;  // 改变分母的符号
    }  
}  
  
// 加法运算  
Rational addRational(Rational r1, Rational r2) {  
    Rational result;  
    result.numerator = r1.numerator * r2.denominator + r2.numerator * r1.denominator;  
    result.denominator = r1.denominator * r2.denominator;  
    simplify(&result);  
    return result;  
}  
  
// 减法运算  
Rational subtractRational(Rational r1, Rational r2) {  
    Rational result;  
    result.numerator = r1.numerator * r2.denominator - r2.numerator * r1.denominator;  
    result.denominator = r1.denominator * r2.denominator;  
    simplify(&result);  
    return result;  
}  
  
// 乘法运算  
Rational multiplyRational(Rational r1, Rational r2) {  
    Rational result;  
    result.numerator = r1.numerator * r2.numerator;  
    result.denominator = r1.denominator * r2.denominator;  
    simplify(&result);  
    return result;  
}  
  
// 除法运算(注意:这里不处理除数为零的情况)  
Rational divideRational(Rational r1, Rational r2) {  
    Rational result;  
    if (r2.numerator == 0) {  
        printf("Error: Division by zero.\n");  
        return (Rational){0, 0}; // 返回一个无效的有理数以表示错误  
    }  
    result.numerator = r1.numerator * r2.denominator;  
    result.denominator = r1.denominator * r2.numerator;  
    simplify(&result);  
    return result;  
}  
  
// 打印有理数  
void printRational(Rational r) {  
    if (r.denominator == 1) {  //分母为1:此时有理数实际上是一个整数,因此只打印分子
        printf("%d\n", r.numerator);  
    } else if (r.numerator == 0) {  //分子为0:此时有理数为0,无论分母是什么,都打印0
        printf("0\n");  
    } else {  //一般情况:如果分子和分母都不是上述特殊情况,则打印分子和分母,格式为 分子/分母
        printf("%d/%d\n", r.numerator, r.denominator);  
    }  
}  
  
int main() {  
    Rational r1, r2, sum, difference, product, quotient;  
  
    // 输入两个有理数  
    printf("请输入第一个有理数的分子和分母(用空格分隔): ");  
    scanf("%d %d", &r1.numerator, &r1.denominator);  
    printf("请输入第二个有理数的分子和分母(用空格分隔): ");  
    scanf("%d %d", &r2.numerator, &r2.denominator);  
  
    // 执行加、减、乘、除运算  
    sum = addRational(r1, r2);  
    difference = subtractRational(r1, r2);  
    product = multiplyRational(r1, r2);  
    quotient = divideRational(r1, r2);  
  
    // 显示结果  
    printf("两个有理数相加的结果是: ");  
    printRational(sum);  
    printf("两个有理数相减的结果是: ");  
    printRational(difference);  
    printf("两个有理数相乘的结果是: ");  
    printRational(product);  
    printf("两个有理数相除的结果是: ");  
    printRational(quotient);  
  
    return 0;  
}
相关推荐
JaydenAI10 分钟前
[MAF预定义ChatClient中间件-06]利用ImageGeneratingChatClient开发专业图片生成Agent
ai·c#·agent·agent管道·chatclient中间件·chatclient管道
wanzehongsheng13 分钟前
基于天文算法的双轴太阳能追踪系统:从原理到工程实现
算法
basketball61615 分钟前
Kadane算法 C++实现
java·c++·算法
handler0115 分钟前
【C++】二叉搜索树详解及其模拟实现(代码)
开发语言·c++·算法·c··二叉搜索树·搜索树
luj_176817 分钟前
残熵算法的稳健防灾逻辑
c语言·开发语言·c++·经验分享·算法
玖釉-18 分钟前
二叉树基础详解:TreeNode、buildTree、deleteTree 与 printTree 的实现原理(C++)
c++·windows·算法
Severus_black18 分钟前
【初阶数据结构与算法】八大排序之非比较排序(计数排序),一次性讲清!
数据结构·算法·排序算法
罗西的思考41 分钟前
【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (4)--- 系统架构
人工智能·算法·机器学习
QiLinkOS43 分钟前
从技术到资产的跃迁:企业专利布局的深层逻辑
c语言·数据结构·c++·单片机·嵌入式硬件·算法·开源
aini_lovee1 小时前
FMCW雷达测速测距系统(锯齿波 + CFAR检测)
算法