题解(超细求赞)
2026-07-29 16:10:02
发布于:上海
6阅读
0回复
0点赞
对分数化简实际就是对两个数同时除以一个数使二者互素(互质)
而这个数绝大部分情况则是二者的最大公约数(gcd)
c++高版本中cmath库中有内置最大公约数函数__gcd()
其用法为:
__gcd(a,b);//返回二者的最大公约数
但同时也可以手写一个gcd函数
常用的方法是欧几里得算法(辗转相除)和辗转相减法(中国古代)[辗转相除时间复杂度更优]
代码如下:
(辗转相除【递归】)
int gcd(int a,int b){
if(a%b==0)return b;
return gcd(b,a%b);
}
(辗转相减【递归】)
int gcd(int a,int b){
bool flag=0;
if(a%2==0&&b%2==0)a/=2,b/=2,flag=1;
while(a!=b){
int big=max(a,b);
int small=min(a,b);
int cha=big-small;
a=max(cha,small);
b=min(cha,small);
}
if(flag)a*=2;
return a;
}
因此完整代码如下:
(1)
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
int gcd=__gcd(a,b);
cout<<a/gcd<<" "<<b/gcd;
return 0;
}
(2)
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
if(a%b==0)cout<<b;
return gcd(b,a%b);
}
int main(){
int a,b;
cin>>a>>b;
int GCD=gcd(a,b);
cout<<a/GCD<<" "<<b/GCD;
return 0;
}
(3)
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
bool flag=0;
if(a%2==0&&b%2==0)a/=2,b/=2,flag=1;
while(a!=b){
int big=max(a,b);
int small=min(a,b);
int cha=big-small;
a=max(cha,small);
b=min(cha,small);
}
if(flag)a*=2;
return a;
}
int main(){
int a,b;
cin>>a>>b;
int GCD=gcd(a,b);
cout<<a/GCD<<" "<<b/GCD
return 0;
}
求赞求赞想要题解仙人50赞,都看到这里了能不能拉几个人给我点赞求求了
!
这里空空如也








有帮助,赞一个