$算术基本定理:任何一个大于1的自然数N,如果N不为质数$
$那么N可以唯一分解成有限个质数的乘积N={p_1}^{a_1} * {p_2}^{a_2}…*{p_n}^{a_n} $
$且最多只有一个大于\sqrt{n}的质因子,这里P1<P2<P3......<Pn均为质数,其中指数ai是正整数。$
$时间复杂度:\sqrt{n}$
#include<bits/stdc++.h>
using namespace std;
void divide(int n){
for(int i=2;i<=n/i;i++){
if(n%i==0){ //n不包含任何从2到i-1之间的质因子(已经被除干净了)
//(n%i==0)所以i也不包含何从2到i-1之间的质因子,由质数的定义可知,保证了i是质数
int s=0;
while(n%i==0) n/=i,s++;
cout<<i<<' '<<s<<endl;
}
}
if(n>1) cout<<n<<' '<<1<<endl; //最多只有一个大于根下n的质因子(两个相乘就大于n了)
cout<<endl;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int a;
cin>>a;
divide(a);
}
}
这个质因数的定义和求解方法个人认为得百度百科一下,上去就看真的很蒙蔽,希望后来者少走弯路,hh,说实话,我太菜了
因为是基础数论,所以当时写的比较简陋,以后尽量详细一些,谢谢指正
确实
谁能给我仔细的说一下为什么n > 1 ,代表的是大于根号的约数,还有n = 1的时候真的很不理解
写在这里供还没想清楚的朋友们一个思路.
性质1:所有大于1的自然数n都可以分解成有限个质因数的乘积,且最多只能分解出一个大于sqrt(n)的质因子。
fact2:代码中的n是变化的,每找到一个质因子i,都会进行除以i直到再也不能整除i
fact3:退出while循环的新n必然不包含i因子,且必然不含比i小的质因子
fact4:当不满足i≤(新n/i)时,即i>sqrt(新n),同时又因为性质1+fact3(可以分解成有限个质因数+没有比sqrt(新n)小的质因数+至多只有一个大于sqrt(n)的质因数),可以得出新n是质数
P. S. 写于没睡醒的早上,在瑞幸喝了一杯生椰拿铁后还没完全清醒,有不严谨的地方请大家不吝赐教
P. P. S. 以前听说过一个说法:当你能把知识能够清楚地跟别人解释的时候,你对这个知识的理解就会加深。今天深以为然。
不明白剩下的那个为啥一定是大于根号n的;
## 注意:时间复杂度最多O(sqrt(N))>T>O(log 2(N) )
时间复杂度为何为根号n呢,里面的while怎么分析的
同求