今天讲解一道数学中常见的最大公约数与最小公倍数问题,靠编程来实现。
题目描述
输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数。
条件:
1. P,A是正整数;
2. 要求P,Q以x0为最大公约数,以y0为最小公倍数。
试求:
满足条件的所有可能的两个正整数的个数。
条件:
1. P,A是正整数;
2. 要求P,Q以x0为最大公约数,以y0为最小公倍数。
试求:
满足条件的所有可能的两个正整数的个数。
输入
每个测试文件只包含一组测试数据,每组两个正整数x0和y0(2<=x0<100000,2<=y0<=1000000)。
题解代码:
输出
对于每组输入数据,输出满足条件的所有可能的两个正整数的个数。
下面是对样例数据的说明:
输入3 60
此时的P Q分别为:
3 60
15 12
12 15
60 3
所以,满足条件的所有可能的两个正整数的个数共4种。
下面是对样例数据的说明:
输入3 60
此时的P Q分别为:
3 60
15 12
12 15
60 3
所以,满足条件的所有可能的两个正整数的个数共4种。
样例输入 Copy
3 60
样例输出 Copy
4
#include<iostream>
using
namespace
std;
int
x0,y0;
//求最大公约数
int
gcd(
int
x,
int
y){
if
(y==0)
return
x;
else
return
gcd(y,x%y);
}
//求最小公倍数
int
gbd(
int
x,
int
y){
int
q=gcd(x,y);
int
x1=x/q;
return
y*x1;
}
int
main(){
scanf
(
"%d%d"
,&x0,&y0);
int
num=1;
int
a[100001];
int
i;
for
(i=1;;i++){
num=i*x0;
a[i-1]=num;
if
(num>y0)
break
;
}
i--;
int
sum=0;
for
(
int
i1=0;i1<i;i1++){
for
(
int
i2=i1+1;i2<i;i2++){
if
(gcd(a[i1],a[i2])==x0&&gbd(a[i1],a[i2])==y0){
sum++;
}
}
}
printf
(
"%d"
,sum*2);
return
0;
}
题解思路:
思路比较简单,
1.写出求最大公约数的函数gcd和求最小公倍数的函数gbd,设置int型变量sum=0,来计算对数.
2.再分析可知,每一对元素的值必定在[x0,y0]中,每一对元素必定为x0的倍数,枚举出x0到y0间x0的所有倍数,建立a[]数组。
3.枚举a[i]元素中的每一位,令它与它之后的每一个元素比较,看是否gcd(a[i],a[j])==x0且gbd(a[i],a[j])==y0,若成立,则sum++;
4.最终将sum*2输出,这套算法时间复杂度为n*logn
解析gcd函数与gbd函数
求最大公约数函数gcd利用递归,在纸上模拟一下便可求出。
最小公倍数函数gbd先求出两个参数x,y的最大公约数q,求出x/q得到的商x1,用y*x1即为所求的最大公约数