輸入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
所以還是要判斷一次最大公約數