日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

7.10 枚举——最大公约数和最小公倍数问题

發布時間:2024/4/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 枚举——最大公约数和最小公倍数问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。