最大公約數和最小公倍數問題


輸入2個正整數x,y(2<=x<100000,2<y<=100000)
求出滿足下列條件的 P,Q的個數

條件:
  1.P,Q 是正整數
  2.要求P,Q以x為最大公約數,以y為最小公倍數
試求:滿足條件的所有可能的2個正整數的個數

這道題我第一眼看就想到用兩個循環暴力枚舉P,Q,再用輾轉相除法求出為最大公約數,再通過最大公約數求出最小公倍數,看是否與x,y相等

 1 #include<iostream>
 2 using namespace std;
 3 int gcd(int a,int b)//最大公約數遞歸函數 
 4 {
 5   if(b==0)return a;
 6   return gcd(b,a%b);
 7 }
 8 int main()
 9 {
10   int x,y,ans=0;
11   cin>>x>>y;
12   for(int i=x;i<=y;i++)//暴力枚舉P,Q 
13     for(int j=x;j<=y;j++)
14       if(gcd(i,j)==x && i*j/gcd(i,j)==y)//求最大公約數,推出最小公倍數 
15         ans++; 
16   cout<<ans;
17 }

 但是只能得七八十分,會超時兩三個

后來我想到兩個數的積等於最大公約數和最小公倍數的積

於是又寫了一個

 1 #include<iostream>
 2 using namespace std;
 3 int gcd(int a,int b)//最大公約數遞歸函數 
 4 {
 5   if(b==0)return a;
 6   return gcd(b,a%b);
 7 }
 8 int main()
 9 {
10   int x,y,ans=0;
11   cin>>x>>y;
12   for(int i=x;i<=y;i++)//枚舉P
13     if(x*y%i==0 && gcd(i,x*y/i)==x)//Q==x*y/i,判斷Q是否存在和最大公約數
14       ans++
15   cout<<ans;
16 }

 

這個程序寫到一半我才發現並不是i*j=x*y的i,j都以x為最大公約數,y為最小公倍數

例如4*45=3*60  5*36=3*60

  5*16=4*20  10*8=4*20

所以還是要判斷一次最大公約數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM