当前位置: 首页 > backend >正文

PAT 1088 Rational Arithmetic

在这里插入图片描述
在这里插入图片描述
这一题的大意是让模拟两个分数进行加减乘除运算,输出计算后的结果。
看起来比较麻烦,但是认真的拆分成一步一步来做还是比较简单的
要注意负数,0,等特殊情况
在进行分数运算的时候,要注意通分和约分,这里会涉及到最小公倍数和最大公因数的算法的书写。
过程就是模拟分数的运算。
第一次提交的代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <unordered_map>
#include <limits.h>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
// 123456789int a1;
int b1;
int a2;
int b2; 
int gcd(int x,int y)
{if(y==0){return x;}else{return gcd(y,x%y);}
}
int lcm(int x,int y)
{return x*y/gcd(x,y);
}
void yuefen(int x,int y)
{if(x==0){cout<<"0";return;}if(y==0){cout<<"Inf";return;} int temp=gcd(abs(x),abs(y));//要判断能不能化为带分数,或者整数 if(abs(x/temp)<abs(y/temp)){if(x/temp<0){cout<<"(";cout<<x/temp<<"/"<<y/temp;cout<<")";}else{cout<<x/temp<<"/"<<y/temp;}}else{if(x/temp<0){cout<<"(";cout<<(x/temp)/(y/temp);if(abs(x/temp)%abs(y/temp)!=0){cout<<" ";cout<<abs(x/temp)%abs(y/temp)<<"/"<<y/temp; }cout<<")";}else{cout<<(x/temp)/(y/temp);if(abs(x/temp)%abs(y/temp)!=0){//5/3比如余2 cout<<" ";cout<<abs(x/temp)%abs(y/temp)<<"/"<<y/temp; }}}}
void print_computejia(int a1,int b1,int a2,int b2)
{//需要通分int x=lcm(b1,b2); int newa1=a1*x/b1+a2*x/b2;//新的分子分母都知道了yuefen(a1,b1);cout<<" + ";yuefen(a2,b2);cout<<" = ";yuefen(newa1,x);cout<<endl;
}
void print_computejian(int a1,int b1,int a2,int b2)
{//需要通分int x=lcm(b1,b2); int newa1=a1*x/b1-a2*x/b2;//新的分子分母都知道了yuefen(a1,b1);cout<<" - ";yuefen(a2,b2);cout<<" = ";yuefen(newa1,x);cout<<endl;
}
void print_computecheng(int a1,int b1,int a2,int b2)
{//需要通分int newa1=a1*a2;int x=b1*b2;//新的分子分母都知道了yuefen(a1,b1);cout<<" * ";yuefen(a2,b2);cout<<" = ";yuefen(newa1,x);cout<<endl;
}
void print_computechu(int a1,int b1,int a2,int b2)
{//需要通分int newa1=a1*b2;int x=b1*a2;if(x<0){x=abs(x);newa1=newa1*(-1);}//新的分子分母都知道了yuefen(a1,b1);cout<<" / ";yuefen(a2,b2);cout<<" = ";if(a2==0){cout<<"Inf";}else{yuefen(newa1,x);}cout<<endl;
}
int main()
{//ios::sync_with_stdio(0),cin.tie(0),cout.tie(scanf("%d/%d %d/%d",&a1,&b1,&a2,&b2);//将两个分数进行计算// 加件法需要通分,// 乘法分子分母直接相乘//除法等于乘一个数的倒数print_computejia(a1,b1,a2,b2); //最后将一个分数化成最简形式print_computejian(a1,b1,a2,b2); print_computecheng(a1,b1,a2,b2);print_computechu(a1,b1,a2,b2);return 0;} 

只通过了两个测试用例,原因是没有开long long
我实际是想到要开long long的,但是
在输入的时候

	scanf("%ld/%ld %ld/%ld",&a1,&b1,&a2,&b2);

这里应该是lld
即:

	scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2);

导致溢出
因此最终代码是:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <unordered_map>
#include <limits.h>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
// 123456789 long long a1;
long long b1;
long long a2;
long long b2;
long long gcd(long long x,long long y)
{if(y==0){return x;}else{return gcd(y,x%y);}
}
long long lcm(long long x,long long y)
{return x*y/gcd(x,y);
}
void yuefen(long long x,long long y)
{if(x==0){cout<<"0";return;}if(y==0){cout<<"Inf";return;} long long temp=gcd(abs(x),abs(y));//要判断能不能化为带分数,或者整数 if(abs(x/temp)<abs(y/temp)){if(x/temp<0){cout<<"(";cout<<x/temp<<"/"<<y/temp;cout<<")";}else{cout<<x/temp<<"/"<<y/temp;}}else{if(x/temp<0){cout<<"(";cout<<(x/temp)/(y/temp);if(abs(x/temp)%abs(y/temp)!=0){cout<<" ";cout<<abs(x/temp)%abs(y/temp)<<"/"<<y/temp; }cout<<")";}else{cout<<(x/temp)/(y/temp);if(abs(x/temp)%abs(y/temp)!=0){//5/3比如余2 cout<<" ";cout<<abs(x/temp)%abs(y/temp)<<"/"<<y/temp; }}}}
void print_computejia(long long a1,long long b1,long long a2,long long b2)
{//需要通分long long x=lcm(b1,b2); long long newa1=a1*x/b1+a2*x/b2;//新的分子分母都知道了yuefen(a1,b1);cout<<" + ";yuefen(a2,b2);cout<<" = ";yuefen(newa1,x);cout<<endl;
}
void print_computejian(long long a1,long long b1,long long a2,long long b2)
{//需要通分long long x=lcm(b1,b2); long long newa1=a1*x/b1-a2*x/b2;//新的分子分母都知道了yuefen(a1,b1);cout<<" - ";yuefen(a2,b2);cout<<" = ";yuefen(newa1,x);cout<<endl;
}
void print_computecheng(long long a1,long long b1,long long a2,long long b2)
{//需要通分long long newa1=a1*a2;long long x=b1*b2;//新的分子分母都知道了yuefen(a1,b1);cout<<" * ";yuefen(a2,b2);cout<<" = ";yuefen(newa1,x);cout<<endl;
}
void print_computechu(long long a1,long long b1,long long a2,long long b2)
{//需要通分long long newa1=a1*b2;long long x=b1*a2;if(x<0){x=abs(x);newa1=newa1*(-1);}//新的分子分母都知道了yuefen(a1,b1);cout<<" / ";yuefen(a2,b2);cout<<" = ";if(a2==0){cout<<"Inf";}else{yuefen(newa1,x);}cout<<endl;
}
int main()
{//ios::sync_with_stdio(0),cin.tie(0),cout.tie(scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2);//将两个分数进行计算// 加件法需要通分,// 乘法分子分母直接相乘//除法等于乘一个数的倒数print_computejia(a1,b1,a2,b2); //最后将一个分数化成最简形式print_computejian(a1,b1,a2,b2); print_computecheng(a1,b1,a2,b2);print_computechu(a1,b1,a2,b2);return 0;
} 

总结,这一道题是模拟分数的四则运算,注意细节,要记牢最大公因数和最小公倍数的算法。
有一道类似的题:

PAT 1081 Rational Sum

`

http://www.xdnf.cn/news/19240.html

相关文章:

  • Python文字识别OCR
  • 蓓韵安禧活性叶酸优生优育守护者
  • CSS基础学习第二天
  • 简说DDPM
  • 【系列07】端侧AI:构建与部署高效的本地化AI模型 第6章:知识蒸馏(Knowledge Distillation
  • 监听nacos配置中心数据的变化
  • vector的学习和模拟
  • 桌面GIS软件添加设置牵引文字标注
  • Fortran二维数组去重(unique)算法实战
  • 电子健康记录风险评分与多基因风险评分的互补性与跨系统推广性研究
  • 福彩双色球第2025100期篮球号码分析
  • GESP5级2024年03月真题解析
  • Coze源码分析-API授权-获取令牌列表-后端源码
  • UNet改进(36):融合FSATFusion的医学图像分割
  • TensorFlow 面试题及详细答案 120道(71-80)-- 性能优化与调试
  • Next.js 快速上手指南
  • 数值分析——算法的稳定性
  • 【ACP】2025-最新-疑难题解析- 练习二汇总
  • 文档转换总出错?PDF工具免费功能实测
  • Docker 部署深度网络模型(Flask框架思路)
  • Intellij IDEA社区版(下载安装)
  • 项目管理方法全流程解析
  • HarmonyOS 持久化存储:PersistentStorage 实战指南
  • 详解推测性采样加速推理的算法逻辑
  • nginx配置websock请求,wss
  • java中的VO、DAO、BO、PO、DO、DTO
  • 【重学 MySQL】九十三、MySQL的字符集的修改与底层原理详解
  • 项目管理和产品管理的区别
  • 【gflags】安装与使用
  • 2025 批量下载雪球和东方财富帖子和文章导出excel和pdf