题目:http://codevs.cn/problem/1012/
思路:p*q = x0 * y0,p的值为x0的倍数,最大为y0,遍历所有p,q值,计算满足条件的个数。
题解:
/* 1012 最大公约数和最小公倍数问题 */
#include <stdio.h>
/* 求取最大公约数 */
int gcd(int m, int n){
return (m % n == 0) ? n : gcd(n, m % n);
}
/* 主函数入口 */
int main(int argc, char *argv[]) {
long x0, y0; /* 最大公约数,最小公倍数 */
long p, q; /* p q */
int count = 0; /* 计数 */
int i; /* 索引 */
/* 获取最大公约数,最小公倍数 */
scanf("%ld %ld", &x0, &y0);
/* p值从1至y0/x0遍历,q = (x0 * y0) / p */
for(i = 1; i <= y0 / x0; i++){
p = x0 * i;
/* q不为整数,退出本次循环 */
if(y0 % p != 0){
continue;
}
/* 获取q值 */
q = x0 * (y0 / p);
/* q值大于p值退出循环 */
if(q < p){
break;
}
/* 如果满足最大公约数条件,计数器加2 */
if(gcd(q, p) == x0){
count = count + 2;
}
}
/* 打印结果 */
printf("%d", count);
return 0;
}