分解质因数
题目
解释
- for语句中,符合条件的i一定是一个质因数!
- 假如 i 是一个合数,那么它一定可以分解成多个质因子相乘的形式,这多个质因子同时也是 a 的质因子且比 i 要小,而比 i 小的数在之前的循环过程中一定是被条件除完了的,所以 i 不可能是合数,只可能是质数
- 遍历的时候可以只搜索到sqrt(n)因为,大于sqrt(n)之后的质因子必然不会超过一个
代码段
#include<iostream>
using namespace std;
void divide(int n)
{
for(int i=2;i*i<=n;i++)
//只需要枚举到小于sqrt(n)的质因子
//因为大于sqrt(n)的质因子必然只有一个
if(n%i==0)
{
int s=0;
while(n%i==0)
{
n/=i;
s++;
}
cout<<i<<' '<<s<<endl;
}
if(n>1)cout<<n<<' '<<1<<endl;
//如果大于sqrt(n)的质因子有一个的话,输出它
}
int main()
{
int n;cin>>n;
while(n--)
{
int m;cin>>m;
divide(m);
cout<<endl;
}
}
完全平方数
题目
解释
- 任何一个数都可以表示成多个质数相乘的形式
- 因此一个完全平方数必然是多个偶数次的质数相乘的形式
- 只需要找到当前数的质因数,通过乘上目标数x使得质因数的次数都为偶数即可
代码段
#include<iostream>
#define ll long long
using namespace std;
ll ans=1;
void divide(ll x)
{
for(ll i=2;i*i<=x;i++)
{
if(x%i==0)
{
ll s=0;
while(x%i==0)
{
x/=i;
s++;
}
if(s%2==0)
continue;
else
ans*=i;
}
}
if(x>1)ans*=x;
}
int main()
{
ll n;
cin>>n;
divide(n);
cout<<ans<<endl;
}