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

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. 卸载ORACLE 11g
  2. 《Adobe InDesign CS5中文版经典教程》—第1课1.9节查找InDesign帮助资源
  3. 解决Java Web项目无法读取配置文件问题
  4. MBProgressHUD
  5. VTK:图像转结构化点用法实战
  6. 2d的公式_旋转之二 - 三维空间中的旋转:罗德里格旋转公式
  7. CCNA配置试验之七 PPP中PAP和CHAP的验证
  8. CDN/视频流成“风口”,2 年内实现规模商用,揭晓 2020 年边缘计算发展现状!...
  9. php怎么发ddos包,解决服务器上通过PHP代码DDOS的方法
  10. VLFeat中SIFT特征点检测
  11. 10^5以下素数筛法——素数表法
  12. 小A与小姐姐给气球涂色 题目描述 小A与小姐姐闲的无聊,它们路过一家商店,看见里面有很多无色的气球,于是他们突然有一
  13. scnaf使用格式化字符串%d接受小数的情况
  14. 服务器摆放需要预留U位么_客厅沙发怎么摆放?六种方法教你如何摆放!(实用荐读)...
  15. 利用word分词来计算文本相似度
  16. 三维激光扫描系统基本原理及分类
  17. 用Kubernetes部署超级账本Fabric的区块链即服务
  18. C语言简单的双人小游戏
  19. 完全卸载oracle|oracle卸载|彻底卸载oracle
  20. ecshop根目录调用_ecshop文件结构名称手册

热门文章

  1. 淘宝新店提升必备-直通车如何开
  2. Qt TCP服务端、客户端;QTcpSocket
  3. Android防止连点非常简单的操作
  4. 【Leetcode】1818.绝对差值和
  5. 关于Matlab插值的问题,这些应该够用了吧
  6. vue获取屏幕高度赋值给div与获取div本身的高度
  7. epson LQ 600KIIH 针式打印机走纸问题
  8. 如何用python爬视频_如何使用python网络爬虫抓取视频?
  9. PID控制原理(全干货)
  10. python 中 函数的使用!!!