【一隻蒟蒻的刷題歷程】【洛谷】P1029 最大公約數和最小公倍數問題 (輾轉相除法)

題目描述

輸入兩個正整數 x0,y0x_0, y_0x0​,y0​,求出滿足下列條件的 P,QP, QP,Q 的個數:

P,Q是正整數。

要求 P,Q以 x0 爲最大公約數,以 y0 爲最小公倍數。

試求:滿足條件的所有可能的 P,Q的個數。

輸入格式

一行兩個正整數 x0,y0​。

輸出格式

一行一個數,表示求出滿足條件的 P,Q 的個數。

輸入輸出樣例 輸入 #1

3 60

輸出 #1

4

說明/提示

P,Q 有 444 種:

3,60
15,12
12,15
60,3


思路:

(百科的圖)
在這裏插入圖片描述最大公約數和最小公倍數的關係:
a * b = ab兩個數的最大公約數和最小公倍數之積

因此: 最小公倍數=a*b / 最大公約數

代碼:

#include <iostream>
using namespace std; 
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
int main() 
{
    int x,y,p,q,ans=0;
    cin>>x>>y;
   for(p=x;p<=y;p++) //一層循環就夠了,根據他們的關係直接求出另一個數
   {
   	  if(x*y%p) continue; //不是整除直接跳過
   	  q=x*y/p;
   	 // int yue=q<p?gcd(q,p):gcd(p,q);似乎兩個數的順序沒要求今天才知道
   	  int yue=gcd(q,p); //這樣也能過
   	  if( yue==x && (q*p)/yue==y) //公約數=x,公倍數=y
   	  ans++;  //是一種方案
   }
   cout<<ans;
   
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章