7.10 枚举——最大公约数和最小公倍数问题
今天讲解一道数学中常见的最大公约数与最小公倍数问题,靠编程来实现。
题目描述
输入二个正整数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即为所求的最大公约数

浙公网安备 33010602011771号