最大公约数和最小公倍数问题
题目描述 Description
输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数
条件: 1.P,Q是正整数
2.要求P,Q以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的两个正整数的个数.
输入描述 Input Description
二个正整数x0,y0
输出描述 Output Description
满足条件的所有可能的两个正整数的个数
样例输入 Sample Input
3 60
样例输出 Sample Output
4
暴力求解法:
#include<iostream> using namespace std; int Isaccord(int x, int y, int P, int Q) { for(int i = x + 1; i <= P; i++) {//检测是否存在比x更大的公因数 if(P % i == 0 && Q % i == 0) return 0; } for(int i = Q; i <= y - 1; i++) {//检测是否存在比y更小的公倍数 if(i % P == 0 && i % Q == 0) return 0; } return 1; } int main() { int x, y; while(cin >> x >> y) { int num = 0; int P, Q; for(P = x; P <= y; P++) { if(P % x == 0 && y % P == 0)//P是x的倍数,y是P的倍数 { for(Q = P; Q <= y; Q++) { if(Q % x == 0 && y % Q == 0) {//x是P、Q的公因数,y是P、Q的公倍数 if(Isaccord(x, y, P, Q))//判断是否是最大公因数,最小公倍数 { if(P == Q) num ++; else num += 2;//P、Q可以交换值作为另一组新的值 } } } } } cout << num << endl; } }
数论初步求解算法
#include<iostream> using namespace std; int main() { int x, y; while(cin >> x >> y) { int num = 1;//记录不同质因数的个数再包括1,因此初始化为1 if(y % x != 0)//y应当是x的倍数,否则不存在符合条件的P、Q cout << 0 << endl; else { int k = y / x;//为简化问题,将所有的数都除以x int k1 = k; int i = 2; while(i <= k) {//当所有的数都除以x后,找出k的所有质因子的 if(k1 % i == 0) num++;//计算不同的质因子的个数 while(k1 % i == 0) k1 = k1 / i; i++; } /*比如说当k=60时,质因子为 2 , 2, 3, 5再额外加上因子1,(因为P可以等于1*x, 此时Q=k*x),将1,2,2,3,5分成两部份,各部分的乘积分别为P,Q,2和2必定要放在一组 (为满足最小公倍数和最大公因数的条件),因此不同的组合是(num - 1)*2 */ cout << (num - 1) * 2 << endl; } } }