求最大公约数:利用每次较大的数对较小的数取模,可以缩小问题规模而保持最大公约数不变,然后重复这个步骤,代码如下:
int zz(int x, int y)
{
if (y == 0)
{
return x;//递归边界
}
else
{
return zz(y, x % y);
}
}
//单行代码可以为
int zz(int x,int y)
{ return y?zz(y,x%y):x;}
利用两数之积除以最大公约数可以得到最小公倍数
代码:
int gbs(int x, int y)
{
return x / zz(x, y) * y;//要注意乘除的先后顺序
}
输入两个正整数 x_0, y_0x0,y0,求出满足下列条件的 P, QP,Q 的个数:
P,QP,Q 是正整数。
要求 P, QP,Q 以 x_0x0 为最大公约数,以 y_0y0 为最小公倍数。
试求:满足条件的所有可能的 P, QP,Q 的个数。
输入格式
一行两个正整数 x_0, y_0x0,y0。
输出格式
一行一个数,表示求出满足条件的 P, QP,Q 的个数。
输入输出样例
输入 #1复制
3 60输出 #1复制
4#include<iostream> using namespace std; int gcd(int x, int y)//单行辗转相除法 { return y ? gcd(y, x % y) : x; } int x, y, p, q, cnt; int main() { cin >> x >> y; for(int k=1;k<=y/k;k++) if (y % k == 0) { if(gcd(k,y/k*x)==x)cnt++;//注意乘除的先后顺序 if(y/k!=k)//重复判断 if(gcd(y/k,k*x)==x)cnt++; } cout<<cnt<<endl; return 0; }