分数运算(gcd)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
计算机中采用浮点数表示所有实数,但这意味着精度丢失。例如无法精确表示“1/3”。 NowCoder最近要处理很多金融问题,这些账目不允许出现精度丢失,因为差之毫厘谬之千里。你能帮他实现一套分数的计算器吗?
输入描述:
输入包含多组数据。 每组数据一行,包含两个分数和一个运算符,中间用空格隔开。 其中分子与分母均为不大于30的正整数。
输出描述:
对应每一组数据,输出两个分数的计算结果。 要求输出最简分数,即分子与分母互质。
输入例子:
1/3 2/3 + 1/5 1/4 - 1/2 1/3 * 2/3 4/3 /
输出例子:
1/1 -1/20 1/6 1/2
题解:利用gcd函数来求解是否互质,但要考虑负数的情况
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a,b,c,d;
char oper;
while(scanf("%d/%d %d/%d %c",&a,&b,&c,&d,&oper)!=EOF)
{
if(oper=='+')
{
int sum1=a*d+b*c;
int sum2=b*d;
while(__gcd(sum1,sum2)!=1)
{
int k=sum1;
sum1/=__gcd(sum1,sum2);
sum2/=__gcd(k,sum2);
}
printf("%d/%d\n",sum1,sum2);
}
if(oper=='-')
{
int sum1=a*d-b*c;
int flag=0;
if(sum1<0)
{
sum1=-sum1;
flag=1;
}
int sum2=b*d;
while(__gcd(sum1,sum2)!=1)
{
int k=sum1;
sum1/=__gcd(sum1,sum2);
sum2/=__gcd(k,sum2);
}
if(flag)
printf("-%d/%d\n",sum1,sum2);
else
printf("%d/%d\n",sum1,sum2);
}
if(oper=='*')
{
int sum1=a*c;
int sum2=b*d;
while(__gcd(sum1,sum2)!=1)
{
int k=sum1;
sum1/=__gcd(sum1,sum2);
sum2/=__gcd(k,sum2);
}
printf("%d/%d\n",sum1,sum2);
}
if(oper=='/')
{
int sum1=a*d;
int sum2=b*c;
while(__gcd(sum1,sum2)!=1)
{
int k=sum1;
sum1/=__gcd(sum1,sum2);
sum2/=__gcd(k,sum2);
}
printf("%d/%d\n",sum1,sum2);
}
}
return 0;
}
作者:李斌
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步