7.10 枚举——最大公约数和最小公倍数问题
生活随笔
收集整理的這篇文章主要介紹了
7.10 枚举——最大公约数和最小公倍数问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天講解一道數學中常見的最大公約數與最小公倍數問題,靠編程來實現。
題目描述
輸入二個正整數x0,y0(2<=x0<100000,2<=y0<=1000000),求出滿足下列條件的P,Q的個數。條件:
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種。
樣例輸入 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即為所求的最大公約數
轉載于:https://www.cnblogs.com/cxs070998/p/11162449.html
總結
以上是生活随笔為你收集整理的7.10 枚举——最大公约数和最小公倍数问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转:【Python3网络爬虫开发实战】6
- 下一篇: layui 单选框、复选框、下拉菜单 不