C语言分数加减乘除化简操作集(含测试源码)
本博文源于胡凡老师的《算法笔记》,书上给出了,一套分数的表示操作集,为了加深印象,写了这篇博文。
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.分数化简
- 如果分母down为负数,那么令分子up和分母down都变为相反数
- 如果分子up为0,那么令分母down为1
- 约分:求出分子绝对值与分母绝对值的最大公约数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.分数显示
- 输出分数前,需要先对其进行化简
- 如果分数r的分母down为1,说明该分数是整数,一般来说题目会要求直接输出分子,而省略分母的输出。
- 如果分数r的分子up的绝对值大于分母down,说明该分数是假分数,
- 如果以上都不满足,那就原样输出。
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语言分数加减乘除化简操作集(含测试源码)相关推荐
- C++大数乘加减除比较操作集(含测试原码)
本博文源于C语言基础,旨在解决大数的乘法.加法.减法.除法.比较运算的操作.并给出测试效果. 测试效果 大数的存储方式 struct bign{int d[1000];int len;bign(){m ...
- 算法笔记随笔:分数的化简,四则运算和输出
#include <stdio.h> #include <math.h> struct Fraction{int up,down; }; int gcd(int a,int b ...
- C语言实现的一个小学生算数自测系统源码分享
C语言实现的一个小学生算数自测系统源码分享 #include <stdio.h> //标准输入输出 #include <stdlib.h> //用于对程序进行退出操作 #inc ...
- Tomcat集群实现源码级别剖析
随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦. ...
- C语言——史上最全通讯录讲解(附源码)
C语言--史上最全通讯录讲解(附源码) 一.开始界面的打印 二.对六大板块进行定义操作 三.对联系人进行初始化 四.对通讯录进行初始化 4.1动态版本 4.2静态版本 五.通讯录六大功能的具体实现 5 ...
- 国际物流集运系统源码,海外仓储一件代发系统
国际物流集运系统源码,海外仓储跨境转运系统源码 开发语言:PHP 数据库:MYSQL 后台系统功能简介: 1.后台主页:全局设置(常用统计.系统信息) 2.包裹管理:扫描入库.未入库包裹.已入库包裹. ...
- C语言期末大作业-学生成绩管理系统(完整源码+设计报告)
C语言-学生成绩管理系统 一.学生成绩管理系统源码(完整) 二.程序设计报告 1.课程设计目的 2.课程设计任务与要求: 4.课程设计成果(运行截图) 5.课程设计心得 一.学生成绩管理系统源码(完整 ...
- C语言打印字符串的所有排列组合(附完整源码)
C语言打印字符串的所有排列组合 字符串的所有排列问题 C语言打印字符串的所有排列组合的完整源码(定义,实现,main函数测试) 字符串的所有排列问题 示例:ABC的排列是ABC,ACB,BCA,BAC ...
- C语言实现线索二叉树Threaded Binary Tree (附完整源码)
C语言实现线索二叉树Threaded Binary Tree 树节点定义 实现以下7个接口 完整实现和main测试源码 树节点定义 typedef struct Node {int data; /** ...
- 集运系统,集运下单系统,国际物流集运系统,转运系统源码 集运系统源码
集运系统,集运下单系统,国际物流集运系统,转运系统源码 集运系统源码 系统简介 一.包裹管理 扫描入库 未入库包裹 已入库包裹 待认领包裹订单 已创建订单包裹 二.订单管理 全部订单 已付款 待付款 ...
最新文章
- 卸载ORACLE 11g
- 《Adobe InDesign CS5中文版经典教程》—第1课1.9节查找InDesign帮助资源
- 解决Java Web项目无法读取配置文件问题
- MBProgressHUD
- VTK:图像转结构化点用法实战
- 2d的公式_旋转之二 - 三维空间中的旋转:罗德里格旋转公式
- CCNA配置试验之七 PPP中PAP和CHAP的验证
- CDN/视频流成“风口”,2 年内实现规模商用,揭晓 2020 年边缘计算发展现状!...
- php怎么发ddos包,解决服务器上通过PHP代码DDOS的方法
- VLFeat中SIFT特征点检测
- 10^5以下素数筛法——素数表法
- 小A与小姐姐给气球涂色 题目描述 小A与小姐姐闲的无聊,它们路过一家商店,看见里面有很多无色的气球,于是他们突然有一
- scnaf使用格式化字符串%d接受小数的情况
- 服务器摆放需要预留U位么_客厅沙发怎么摆放?六种方法教你如何摆放!(实用荐读)...
- 利用word分词来计算文本相似度
- 三维激光扫描系统基本原理及分类
- 用Kubernetes部署超级账本Fabric的区块链即服务
- C语言简单的双人小游戏
- 完全卸载oracle|oracle卸载|彻底卸载oracle
- ecshop根目录调用_ecshop文件结构名称手册