题目描述
一个合数一定可以被多个质数相乘表示得到
例如 100可以被分解为100=225*5
算法流程 时间复杂度O(sqrt(n))
循环遍历i到sqrt(n) 如果当前i能被当前n整除 说明当前i是当前n的因子
代码如下:
#include<iostream>
using namespace std;
const int N = 10010;
int res[N];
void divid(int n){//分解质因数
for(int i = 2;i <= n/i;i++){//输出的是小于sqrt(n)的所有因子
int s = 0;
if(n % i == 0){//当前i是n的一个质因子
while(n % i == 0)//不断循环除i 看下能被多少个i整除
{
n /= i;
s++;
}
}
if(s != 0)//将当前质因子输出有多少个
{
for(int j = 0;j < s;j++)
printf("%d ",i);
}
}
if(n > 1)//如果循环出来 发现经历了前sqrt(n)的因子还没将n分解
//说明n有大于sqrt(n)的质数因子
printf("%d",n);
}
int main(){
int n;
scanf("%d",&n);
divid(n);
return 0;
}
困惑解释:为什么循环n%i==0得到的i一定是质数
这样考虑 首先 一个合数的质因子一定有2 或者3
那么 当循环到i 说明1~i-1的质因子已经被筛选干净
说明 你当前这个n 已经不能被前面1~i-1的质因子给整除了
又n%i == 0 那么你的这个i也不能被前面的1~i-1给整除
那么说明你这个i就是质数 因为如果是合数 就能被前面的1~i-1前面的质数表示 那就可以整除 那就有矛盾了 所以这个i一定是质数