第七章 数学 AcWing 1567. 有理数的和
原题链接
算法标签
数学 模拟
思路
直接模拟分数除法操作超出long int 范围
虽然所有分子分母取值均在 long int 范围内,但是分母相乘与分子相乘相加会超出long int 范围
思路
读入分子分母 对分子分母约分
分数计算过程 对分子分母约分
分数计算结果 对分子分母约分
即对于每部操作都需对分子分母约分 避免答案超出long int 范围
代码
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define ump unordered_map
#define ums unordered_set
#define pq priority_queue
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>=b;--i)
using namespace std;
typedef pair<int, int> PII;
const int N=10005, INF=0x3f3f3f3f3f3f3f3f;
const double Exp=1e-8;
//int t, n, m, cnt, ans;
int n, a=0, b=1, c, d, t;
inline int rd(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) put(x/10);
putchar(x%10^48);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
n=rd();
while(n--){
scanf("%lld/%lld", &c, &d);
t=__gcd(c, d);
c/=t, d/=t;
t=__gcd(b, d);
a=d/t*a+b/t*c;
b=b/t*d;
t=__gcd(a, b);
a/=t, b/=t;
}
if(a>b){
if(a-a/b*b){
printf("%lld %lld/%lld", a/b, a-a/b*b, b);
}else{
printf("%lld", a/b);
}
}else{
if(a){
printf("%lld/%lld", a, b);
}else{
printf("0");
}
}
return 0;
}
参考文献
AcWing 1567. 有理数的和(PAT甲级辅导课)y总视频讲解
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈