题目描述
输入两个正整数 x_0, y_0x ,求出满足下列条件的 P, Q的个数:
- P,Q 是正整数。
- 要求 P, Q 以 x_0为最大公约数,以 y_0 为最小公倍数。
试求:满足条件的所有可能的 P, Q 的个数。
输入格式
一行两个正整数 x_0, y_0;
输出格式
一行一个数,表示求出满足条件的 P, Q 的个数。
样例
输入:3 60
输出:4
代码
#include<bits/stdc++.h>
using namespace std;
int check(int i,int j){
int k ,t = 1;
//如果i<j,调换位置
if(i<j){
k = i;
i = j;
j = k;
}
//循环找到最大公约数
while(t) {
t = i%j;
i = j;
j = t;
}
return i;
}
int main(){
int x,y,j,re = 0;
cin>>x>>y;
//最大公约数,最小公倍数,
//范围为【x,y】,步长为x
for(int i = x;i<=y;i+=x){
//根据最小公倍数的公式得出j
if((x*y)%i == 0){
j = x*y/i;
if(check(i,j)==x){
re++;
}
}
}
cout<<re<<endl;
return 0;
}
求最大公约数
辗转相除法:
- 辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
大概为:大数除以小数,然后大数等于小数,小数等于余数
例如,求(319,377):
∵ 377÷319=1(余58)
∴(377,319)=(319,58);
∵ 319÷58=5(余29)
∴ (319,58)=(58,29);
∵ 58÷29=2(余0)
∴ (58,29)= 29;
∴ (319,377)=29。 - 用辗转相除法求几个数的最大公约数 :可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。
更相减损法
- 第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
- 第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
例子: 用更相减损术求260和104的最大公约数。
解:由于260和104均为偶数,首先用2约简得到130和52,再用2约简得到65和26。
此时65是奇数而26不是奇数,故把65和26辗转相减:
65-26=39
39-26=13
26-13=13
所以,260与104的最大公约数等于13乘以第一步中约掉的两个2,即13* 2 *2=52。
求最大公倍数
两个数的乘积等于这两个数的最大公约数与最小公倍数的积。
end.