有理数四则运算

实验内容

(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.xdnf.cn/news/1542643.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

java项目之线上辅导班系统的开发与设计

项目简介 基于springboot的线上辅导班系统的开发与设计的主要使用者分为&#xff1a; 管理员在后台主要管理字典管理、论坛管理、公开课管理、课程管理、课程报名管理、课程收藏管理、课程留言管理、师资力量管理、用户管理、管理员管理等。 &#x1f495;&#x1f495;作者&a…

单细胞monocle3分析流程再整理

重读上一篇关于monocle3的推文的时候感觉内容冗长繁琐&#xff0c;因此笔者把关键部分代码稍作了整理。 推文链接&#xff1a;单细胞拟时序/轨迹分析monocle3流程学习和整理 https://mp.weixin.qq.com/s/NRrFH8sjdUUq20z9hWAFyQ 也可以看一看monocle2推文&#xff1a; 单细胞…

探索 ShellGPT:终端中的 AI 助手

文章目录 探索 ShellGPT&#xff1a;终端中的 AI 助手背景介绍ShellGPT 是什么&#xff1f;如何安装 ShellGPT&#xff1f;简单的库函数使用方法场景应用常见问题及解决方案总结 探索 ShellGPT&#xff1a;终端中的 AI 助手 背景介绍 在当今快速发展的技术领域&#xff0c;命…

双非本 985 硕士,秋招上岸字节算法岗!

最近已有不少大厂都在秋招宣讲了&#xff0c;也有一些在 Offer 发放阶段。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新人如何快速入门算法岗、如何准备面试攻略、面试常考点、大模型项目落地经验分享等热门话题进行了深入的讨论。…

Chainlit集成LlamaIndex实现知识库高级检索(自动合并检索)

检索原理 自动合并检索 自动合并检索原理&#xff0c;和我的上一篇文章的检索方案&#xff1a; 将文本分割成512大小&#xff08;一般对应段落大小&#xff09;和128&#xff08;一般对句子大小不是严格的句子长度&#xff09;大小两种分别存储到索引库&#xff0c;再用llama_…

架构设计笔记-5-软件工程基础知识

知识要点 按软件过程活动&#xff0c;将软件工具分为软件开发工具、软件维护工具、软件管理和软件支持工具。 软件开发工具&#xff1a;需求分析工具、设计工具、编码与排错工具。 软件维护工具&#xff1a;版本控制工具、文档分析工具、开发信息库工具、逆向工程工具、再工…

快速解决Isaac Sim资源获取不到问题

国内使用Isaac Sim的时候&#xff0c;最常见的问题是加载不了USD或材质资源&#xff0c;这会导致整个Isaac Sim软件卡住或崩溃&#xff0c;以及无法继续开展项目。比如加载realsense或&#xff0c;最新的Isaac Sim 4.2.0 加载一个激光雷达&#xff0c;都要获取相关传感器usd&am…

桶排序和计数排序(非比较排序算法)

桶排序 桶排序是一种基于分配的排序算法&#xff0c;特别适合用来排序均匀分布的数据。它的基本思想是将输入的数据分到有限数量的桶里&#xff0c;然后对每个桶内的数据分别进行排序&#xff0c;最后再将各个桶内的数据合并得到最终的排序结果。(通常用于浮点数&#xff0c;因…

RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案

RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案 &#x1f6e0;️ RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案摘要 &#x1f4c3;引言 ✨1. 什么是递归&#xff1f;&#x1f50d;1.1 递归的基本概念 &#x…

JavaScript可视化示例

JavaScript 可视化是指使用 JavaScript 编程语言来创建和操作图形、图表、动画等视觉元素的过程。以下是一些常见的 JavaScript 可视化库和工具&#xff0c;以及它们的主要特点&#xff1a; 1. D3.js 特点: D3.js&#xff08;Data-Driven Documents&#xff09;是一个非常强大…

思维商业篇(4)—产业上下游定

思维商业篇(4)—产业上下游定位(微笑曲线) 产业上下游定位&#xff0c;帮助我们去观察一个企业在产业上下游中处于一个什么样的生态位。 上游 处于产业链开始端&#xff0c;百川东到海&#xff0c;百川的的起始端就是上游&#xff0c;东到海的海就是下游。 处在上游的企业一…

嵌入式系统基础讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 嵌入式系统是计算机科学与电子工程的交叉领域&#xff0c;广泛应用于消费电子、工业控制、汽车、医疗设备等多个行业。嵌入式系统设计涉及硬件和软件的协同开发&#xff0c;要求开发者掌握多方面的基础知识。…

Python学习——【4.4】数据容器(序列)的切片

文章目录 【4.4】数据容器&#xff08;序列&#xff09;的切片一、了解什么是序列二、掌握序列的切片操作 【4.4】数据容器&#xff08;序列&#xff09;的切片 一、了解什么是序列 序列是指&#xff1a;内容连续、有序&#xff0c;可使用下标索引的一类数据容器。 列表、元组…

基于单片机的粮仓环境检测系统设计

本设计主要由处理模块、温湿度检测模块、数据显示模块、声光报警模块和按钮的输入模块组成。采用了AT89C52作为主要的控制单元&#xff0c;利用DHT11温湿度传感器&#xff0c;对粮食仓库中的温度和湿度等展开检测&#xff0c;并在LCD1602液晶显示器中进行实时显示。同时&#x…

双向链表:实现、操作与分析【算法 17】

双向链表&#xff1a;实现、操作与分析 引言 双向链表&#xff08;Doubly Linked List&#xff09;是链表数据结构的一种重要形式&#xff0c;它允许节点从两个方向进行遍历。与单向链表相比&#xff0c;双向链表中的每个节点不仅包含指向下一个节点的指针&#xff08;或引用&…

iOS常见锁及应用(笔记版)

什么是锁&#xff1f; 在程序中&#xff0c;当多个任务&#xff08;或线程&#xff09;同时访问同一个资源时&#xff0c;比如多个操作同时修改一份数据&#xff0c;可能会导致数据不一致。这时候&#xff0c;我们需要“锁”来确保同一时间只有一个任务能够操作这个数据&#…

django项目——图片上传到阿里云OSS对象存储

文章目录 实现图片上传到阿里云OSS对象存储1. 创建阿里云OSS对象存储2. 查询获取接口访问key和秘钥3. 安装阿里云的SDK集成到项目中使用3.1 python直接操作oss23.2 django配置自定义文件存储上传文件到oss 实现图片上传到阿里云OSS对象存储 1. 创建阿里云OSS对象存储 开发文档…

顶点缓存对象(VBO)与顶点数组对象(VAO)

我们的顶点数组在CPU端的内存里是以数组的形式存在,想要GPU去绘制三角形,那么需要将这些数据传输给GPU。那这些数据在显存端是怎么存储的呢?VBO上场了,它代表GPU上的一段存储空间对象,表现为一个unsigned int类型的变量,GPU端内存对象的一个ID编号、地址、大小。一个VBO对…

Python爬虫之urllib模块详解

Python爬虫入门 此专栏为Python爬虫入门到进阶学习。 话不多说&#xff0c;直接开始吧。 urllib模块 Python中自带的一个基于爬虫的模块&#xff0c;其实这个模块都几乎没什么人用了&#xff0c;我就随便写写了。 - 作用&#xff1a;可以使用代码模拟浏览器发起请求。&…

基于python的文本聚类分析与可视化实现,使用kmeans聚类,手肘法分析

1、数据预处理 由于在数据分析之前数据集通常都存在数据重复、脏数据等问题&#xff0c;所以为了提高 数据分析结果的质量&#xff0c;在应用之前就必须对数据集进行数据预处理。数据预处理的方法通常有清洗、集成、转换、规约这四个方面&#xff0c;接下来详细介绍这对爬取…