在编写C++的时候我们经常遇到分数当要约分时,是一件头疼事情那我们怎么办?
这时候我们就要使用函数gcd了.
如下面的例题
题目描述
输入 22 个正整数 x_0,y_0(2 le x_0<100000,2 le y_0<=1000000)x0,y0(2≤x0<100000,2≤y0<=1000000) ,求出满足下列条件的 P,QP,Q 的个数
条件:
-
P,Q 是正整数
-
要求 P,Q 以 x_0x0 为最大公约数,以 y_0y0 为最小公倍数.
试求:满足条件的所有可能的 22 个正整数的个数.
输入输出格式
输入格式:
22 个正整数 x_0,y_0x0,y0
输出格式:
11 个数,表示求出满足条件的 P,Q 的个数
输入输出样例
说明
P,Q 有4种
1、3,60
2、15,12
3、12,15
4、60,3
题解思路如下
如题意我们可以知道它已经给出了最大公约数和最小公倍数,由数论的知识可以知道在知道最大公约数和最小公倍数的情况下满足这两个条件的数他们的乘积等于最大公约数和最小公倍数的乘积,举个列子如样例最大公约数x0=3,最小公倍数y0=60.满足这两个条件的数有(3,60),(15,12),(12,15),(60,3);
我们可以发现x0*y0=3*60或15*12或12*15或60*3;
发现这个后我们就知道了这怎个数据的最大范围,就可以枚举答案了
AC代码如下
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
int x0,y0,ans=0,tmp;//将ans赋值为0方便后面我们计数,tmp记录数据范围
int a,b;
cin>>x0>>y0;
tmp=x0*y0;//由前面的分析可的数据的范围
for(int a=1;a<=tmp;a++)//开始判断
{
if(tmp%a!=0) continue;//我们知道tmp是两个数的乘积所以a,b必定是tmp的因数如果不是循环就断掉
b=tmp/a;//计算出另一个数
if(__gcd(a,b)==x0)//判断这两个数的最大公约数是否为x0,因为我们声名了一个<cmath>的头文件库所以可以直接调用gcd函数来找这两个数的最大公约数
ans++;//如果最大公约数为x0则满足题意ans+1计数
}
cout<<ans;
return 0;
}