P1029 最大公约数和最小公倍数问题(普及−) 题解
生活随笔
收集整理的這篇文章主要介紹了
P1029 最大公约数和最小公倍数问题(普及−) 题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目傳送門
想要做這題,我們要先了解一下最大公約數。
最大公因數,也稱最大公約數、最大公因子,指兩個或多
個整數共有約數中最大的一個。a,b的最大公約數記為
(a,b),同樣的,a,b,c的最大公約數記為(a,b,
c),多個整數的最大公約數也有同樣的記號。求最大公
約數有多種方法,常見的有質因數分解法、短除法、輾轉
相除法、更相減損法。
還有最小公倍數
兩個或多個整數公有的倍數叫做它們的公倍數,其中除0
以外最小的一個公倍數就叫做這幾個整數的最小公倍數。
整數a,b的最小公倍數記為[a,b],同樣的,a,b,c的
最小公倍數記為[a,b,c],多個整數的最小公倍數也有
同樣的記號。
我才不會告訴你我是抄的百度百科呢!
下面進入正題,因為最大公約數*最小公倍數是等于原數之積的,所以有了下面的式子。
X0乘Y0=P乘Q
所以這道題我們可以用暴力做,下面是代碼。
#include <bits/stdc++.h>//萬能頭
using namespace std;
int n,m,s;//統計PQ的個數
int main()
{
cin>>n>>m;
for(int i=n;i<=m;i++)
{
for(int j=n;j<=m;j++)
{
if(__gcd(i,j)==n&&i*j/__gcd(i,j)==m)//__gcd是求最大公約數函數
{
s++;//注意,這里不能加2,因為這里是統計PQ一共有多少組,而不是P和Q一共有多少個
}
}
}
cout<<s;//直接輸出
return 0;
}
不帶注釋版[壞笑]
#include <bits/stdc++.F>
using namespace std;
int a,b,s;
int mian()
{
cin>>n>>m;
for(int i=n;i<=m;j++)
{
for(int j=n;;j++)
{
if(__gcd(i,j)==m&&ji*j/__gcd(i,j)==n)
{
s+;
}
}
}
cout<<s;
retrun 0;
}
但是暴力還是沒有AC,錯誤有以下兩個
-
Noip比賽中不允許使用__gcd函數
-
兩個for循環導致TLE
知道了錯誤,就趕緊改正吧,下面是AC代碼
#include<iostream>
using namespace std;
int ans;
int lcm(int a,int b)//最小公倍數函數
{
if(a<b)
{
swap(a,b);
}
if(a%b==0)
{
return b;//輾轉相除法
}
else
{
return lcm(b,a%b);
}
}
int gcd(int a,int b)//最大公約數函數
{
return (a*b/lcm(a,b));// 直接用前面 X0乘Y0=P乘Q的公式求出最大公約數
}
int main()
{
int a,b;
cin>>a>>b;//輸入
for(int i=a;i<=b;i++)
{
int j=a*b/i; //這就是優化的地方,因為X0乘Y0=P乘Q,所以j可以不用for循環,直接用a*b/i就行了
if(lcm(i,j)==a&&gcd(i,j)==b) //如果用函數算出來i和j的最大公約數和最小公倍數與a,b相等
{
ans++;//標記加1
}
}
cout<<ans; //輸出
return 0;
}
不帶注釋版[壞笑]
#include<iostream>
using namespace std;
int ans;
int lcm(int a,int b)
{
if(a<b)
{
swap(a,b);
}
if(a%b==0)
{
return b;
}
else
{
return lcm(b,a%b);
}
}
int gcd(int a,int b)
{
return (a*b/lcm(a,b));
}
int main()
{
int a,b;
cin>>a>>b;
while(1) cout<<"(‘_’)";
for(int i=a;i<=b;i++)
{
int j=a*b/i;
if(lcm(i,j)==a&&gcd(i,j)==b)
{
ans++;
}
}
cout<<ans;
return 0;
}
總結
以上是生活随笔為你收集整理的P1029 最大公约数和最小公倍数问题(普及−) 题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序文件预览和下载-文件系统
- 下一篇: 再学Blazor——组件建造者