有理数四则运算

server/2024/9/23 3:16:25/

实验内容

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

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

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

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

注意:

  1. 这个程序没有处理除法运算,因为除法运算相对复杂,需要引入除法后结果的整数部分和小数部分,且可能涉及浮点数的处理。
  2. printRational函数中,我们简单实现了约分功能,通过寻找分子和分母的最大公约数(gcd)来约分。这里使用了简单的穷举法来计算gcd,对于大数可能不够高效,但足以应对本示例的需求。
  3. 当处理有理数时,应始终确保分母不为0,尽管在这个示例中用户直接输入,实际应用中可能需要加入更严格的输入验证。
  4. 输出时,如果分母为负数,则将整个有理数取反,以确保输出的有理数总是正数或零(分子为零时)。
#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->numerator->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,无论分母是什么,都打印0printf("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;  
}


http://www.ppmy.cn/server/120598.html

相关文章

数据集-目标检测系列-火车检测数据集 train >> DataBall

数据集-目标检测系列-火车检测数据集 train >> DataBall 数据集-目标检测系列-火车检测数据集 数据量&#xff1a;1W 想要进一步了解&#xff0c;请联系 DataBall。 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;不断增加…

【系统架构设计师】软件架构的风格(经典习题)

更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 【第1题】【第2题】【第3~4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15~16题】【第17题】【第18~19题】【第20~21题】【第22题】【第23题】【第24~…

OpenCore Legacy Patcher 2.0.0 发布,83 款不受支持的 Mac 机型将能运行最新的 macOS Sequoia

在不受支持的 Mac 上安装 macOS Sequoia (OpenCore Legacy Patcher v2.0.0) Install macOS on unsupported Macs 请访问原文链接&#xff1a;https://sysin.org/blog/install-macos-on-unsupported-mac/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主…

【hot100-java】【每日温度】

R8-栈篇 印象题:单调栈的使用 参考本人博客&#xff1a;单调栈 class Solution {public int[] dailyTemperatures(int[] temperatures) {int numtemperatures.length;int [] retnew int[num];Stack<Integer>stnew Stack<>();for (int i0;i<num;i){while(!st.…

JVM运行区域介绍

JVM运行区域是Java程序执行的核心支撑&#xff0c;它们共同保障了程序的正确执行、高效运行、并发支持、跨平台性以及安全性。现为大家深入解析JVM运行区域的工作原理和重要性。 一、JVM运行区介绍 JVM&#xff08;Java虚拟机&#xff09;在运行时会将内存空间划分为几个不同…

mongodb 主从集群,分片集群

1. 2.分片集群&#xff1a; 2.1压缩包搭建集群 https://www.cnblogs.com/hahaha111122222/p/13969911.html 2.2docker 安装集群 MongodB分区分片搭建(docker)_docker 分层 mongodb-CSDN博客 docker搭建mongo分片集群_docker mongo集群-CSDN博客 Docker 安装 MongoDB_docker…

SpringBoot 整合 Caffeine 实现本地缓存

目录 1、Caffeine 简介1.1、Caffeine 简介1.2、对比 Guava cache 的性能主要优化项1.3、常见的缓存淘汰算法1.4、SpringBoot 集成 Caffeine 两种方式 2、SpringBoot 集成 Caffeine 方式一2.1、缓存加载策略2.1.1、手动加载2.1.2、自动加载【Loading Cache】2.1.3、异步加载【As…

Java IO文件操作 总结

1.简介 Java对文件IO操作提供了相应的方法&#xff0c;这篇文章简单总结一下。 2.常用方法 String filePath "/Users/jojo/IdeaProjects/data/"; File file new File(filePath);//创建对象file.isFile();//当前的文件对象是否为文件还是文件夹&#xff1a;文件…