本博文源于胡凡老师的《算法笔记》,书上给出了,一套分数的表示操作集,为了加深印象,写了这篇博文。

1.分数表示

分数由分子up和分母downn表示。

struct Fraction{int up,down;
};

2. 分数加法

假设两个分数f1,f2,其计算公式为
result=f1.up∗f2.down+f2.up∗f1.downf1.down∗f2.downresult = \frac{f1.up*f2.down+f2.up*f1.down}{f1.down*f2.down} result=f1.down∗f2.downf1.up∗f2.down+f2.up∗f1.down​

Fraction add(Fraction f1,Fraction f2){Fraction res;res.up = f1.up * f2.down + f2.up * f1.down;res.down = f1.down * f2.down;return reduction(res);
}

3.分数减法

假设两个分数f1和f2,其减法计算公式
result=f1.up∗f2.down−f2.up∗f1.downf1.down∗f2.downresult = \frac{f1.up*f2.down-f2.up*f1.down}{f1.down*f2.down} result=f1.down∗f2.downf1.up∗f2.down−f2.up∗f1.down​

Fraction minu(Fraction f1,Fraction f2){Fraction res;res.up = f1.up * f2.down - f2.up*f1.down;//分数差的分子res.down = f1.down * f2.down; //分数差的分母return reduction(res);}

4.分数乘法

对两个分数f1和f2,其乘法计算公式为
result=f1.up∗f2.upf1.down∗f2.downresult = \frac{f1.up*f2.up}{f1.down*f2.down} result=f1.down∗f2.downf1.up∗f2.up​,

Fraction multi(Fraction f1,Fraction f2){Fraction r;r.up = f1.up * f2.up;r.down = f1.down * f2.down;return reduction(r);
}

5.分数除法

对两个分数f1和f2,其除法计算公式为
result=f1.up∗f2.downf1.down∗f2.upresult = \frac{f1.up*f2.down}{f1.down*f2.up} result=f1.down∗f2.upf1.up∗f2.down​

Fraction divide(Fraction f1,Fraction f2){Fraction r;r.up = f1.up * f2.down;r.down = f1.down * f2.down;return reduction(r);
}

3.分数化简

  1. 如果分母down为负数,那么令分子up和分母down都变为相反数
  2. 如果分子up为0,那么令分母down为1
  3. 约分:求出分子绝对值与分母绝对值的最大公约数d,然后令分子分母同时除以d
Fraction reduction(Fraction result){if(result.down <0){//字母为负数,令分子和分母都变为相反数result.up = -result.up;result.down = -result.down;}if(result.up == 0){  //如果分子为0result.down = 1; //令分母为1}else{//如果分子不为0,进行约分int d = gcd(abs(result.up),abs(result.down));//分子分母的最大公约数result.up /= d;result.down /= d;}return result;
}

4.分数显示

  1. 输出分数前,需要先对其进行化简
  2. 如果分数r的分母down为1,说明该分数是整数,一般来说题目会要求直接输出分子,而省略分母的输出。
  3. 如果分数r的分子up的绝对值大于分母down,说明该分数是假分数,
  4. 如果以上都不满足,那就原样输出。
void showResult(Fraction r){r = reduction(r);if(r.down == 1) printf("%lld\n",r.up); //整数else if(abs(r.up) > r.down) { //假分数printf("%d %d/%d\n",r.up/r.down,abs(r.up)%r.down,r.down);}else{printf("%d/%d\n",r.up,r.down);}
}

完整代码

#include<stdio.h>
#include<math.h>
struct Fraction{int up,down;
};
int gcd(int a,int b){if(b==0) return a;else return gcd(b,a%b);
}
Fraction reduction(Fraction result){if(result.down <0){//字母为负数,令分子和分母都变为相反数result.up = -result.up;result.down = -result.down;}if(result.up == 0){  //如果分子为0result.down = 1; //令分母为1}else{//如果分子不为0,进行约分int d = gcd(abs(result.up),abs(result.down));//分子分母的最大公约数result.up /= d;result.down /= d;}return result;
}
//分数的加法运算
Fraction add(Fraction f1,Fraction f2){Fraction res;res.up = f1.up * f2.down + f2.up * f1.down;res.down = f1.down * f2.down;return reduction(res);
}//分数的减法运算
Fraction minu(Fraction f1,Fraction f2){Fraction res;res.up = f1.up * f2.down - f2.up*f1.down;//分数差的分子res.down = f1.down * f2.down; //分数差的分母return reduction(res);}//分数逇乘法运算
Fraction multi(Fraction f1,Fraction f2){Fraction r;r.up = f1.up * f2.up;r.down = f1.down * f2.down;return reduction(r);
}//分数的除法
Fraction divide(Fraction f1,Fraction f2){Fraction r;r.up = f1.up * f2.down;r.down = f1.down * f2.down;return reduction(r);
}void showResult(Fraction r){r = reduction(r);if(r.down == 1) printf("%lld\n",r.up); //整数else if(abs(r.up) > r.down) { //假分数printf("%d %d/%d\n",r.up/r.down,abs(r.up)%r.down,r.down);}else{printf("%d/%d\n",r.up,r.down);}
}int main()
{//测试分数的显示包含化简Fraction res;res.down = 12;res.up = 6;showResult(res);//测试分数的加法,减法,乘法,除法Fraction op1{3,7};Fraction op2{4,9};showResult(add(op1,op2));showResult(minu(op1,op2));showResult(multi(op1,op2));showResult(divide(op1,op2));return 0;}

测试效果

C语言分数加减乘除化简操作集(含测试源码)相关推荐

  1. C++大数乘加减除比较操作集(含测试原码)

    本博文源于C语言基础,旨在解决大数的乘法.加法.减法.除法.比较运算的操作.并给出测试效果. 测试效果 大数的存储方式 struct bign{int d[1000];int len;bign(){m ...

  2. 算法笔记随笔:分数的化简,四则运算和输出

    #include <stdio.h> #include <math.h> struct Fraction{int up,down; }; int gcd(int a,int b ...

  3. C语言实现的一个小学生算数自测系统源码分享

    C语言实现的一个小学生算数自测系统源码分享 #include <stdio.h> //标准输入输出 #include <stdlib.h> //用于对程序进行退出操作 #inc ...

  4. Tomcat集群实现源码级别剖析

    随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦. ...

  5. C语言——史上最全通讯录讲解(附源码)

    C语言--史上最全通讯录讲解(附源码) 一.开始界面的打印 二.对六大板块进行定义操作 三.对联系人进行初始化 四.对通讯录进行初始化 4.1动态版本 4.2静态版本 五.通讯录六大功能的具体实现 5 ...

  6. 国际物流集运系统源码,海外仓储一件代发系统

    国际物流集运系统源码,海外仓储跨境转运系统源码 开发语言:PHP 数据库:MYSQL 后台系统功能简介: 1.后台主页:全局设置(常用统计.系统信息) 2.包裹管理:扫描入库.未入库包裹.已入库包裹. ...

  7. C语言期末大作业-学生成绩管理系统(完整源码+设计报告)

    C语言-学生成绩管理系统 一.学生成绩管理系统源码(完整) 二.程序设计报告 1.课程设计目的 2.课程设计任务与要求: 4.课程设计成果(运行截图) 5.课程设计心得 一.学生成绩管理系统源码(完整 ...

  8. C语言打印字符串的所有排列组合(附完整源码)

    C语言打印字符串的所有排列组合 字符串的所有排列问题 C语言打印字符串的所有排列组合的完整源码(定义,实现,main函数测试) 字符串的所有排列问题 示例:ABC的排列是ABC,ACB,BCA,BAC ...

  9. C语言实现线索二叉树Threaded Binary Tree (附完整源码)

    C语言实现线索二叉树Threaded Binary Tree 树节点定义 实现以下7个接口 完整实现和main测试源码 树节点定义 typedef struct Node {int data; /** ...

  10. 集运系统,集运下单系统,国际物流集运系统,转运系统源码 集运系统源码

    集运系统,集运下单系统,国际物流集运系统,转运系统源码 集运系统源码 系统简介 一.包裹管理 扫描入库 未入库包裹 已入库包裹 待认领包裹订单 已创建订单包裹 二.订单管理 全部订单 已付款 待付款 ...

最新文章

  1. 控制iptables的nat转发端口的实现
  2. linux 网络编程:使用两线程实现socket同时收发数据
  3. 前端学习(3129):react-hello-react之回调形式的ref的次数问题
  4. 对于spring的一些巩固一些难点的理解 2021-04-18
  5. matlab plot 坐标轴标注,Matlab绘图坐标轴的设置教程
  6. 操作系统--用户级线程和内核级线程
  7. 你的主机中的软件中止了一个已建立的连接。_winscp中文版,winscp中文版软件的使用技巧...
  8. UG12.0运动仿真分析基础到精通视频教程
  9. 荣耀手机安装谷歌框架_华为手机怎么安装谷歌框架 华为mate20谷歌框架安装教程...
  10. 【附源码】计算机毕业设计java原创网络文学管理系统设计与实现
  11. 伪原创内容来源的八个渠道
  12. 数据结构与算法(十一)哈夫曼树及其应用
  13. AI语音外呼机器人是如何帮助电销行业获客
  14. python爬虫--第一个爬虫程序
  15. iOS 像素图转高清大图
  16. 99%的人都想要的广告拦截软件
  17. 润和软件为OpenHarmony落地智慧城市构建高效可靠软件基座
  18. 解读:一种基于扩张卷积和区域转移注意力机制的深度时空网络模型
  19. GIS-空间分析(1)
  20. 浙江大学计算机学霸作息,浙大男神学霸:学习时间计划精确到“分、秒”,作息表引家长点赞...

热门文章

  1. 黑苹果相关驱动介绍及其使用方法
  2. 模2除法介绍(CRC校验码计算)
  3. xmind8 pro 进阶班-Array老师-专题视频课程
  4. Egg.js -- 及案列介绍
  5. PICkits3调试功能
  6. PS矩形选择框基础操作
  7. 词根词缀整理2019-3-20
  8. 未来教育二级c语言的答案库在哪里,未来教育计算机二级c语言题库
  9. 【插件】油猴插件安装
  10. 数学的意义与数学教育的价值