分解素因数
标签: 机试攻略 - 高分篇
学习人数: 19.7k


高清播放
赞赏支持

我们知道,对于任意一个大于1的整数,它都可以分解成多个质因子相乘的形式。

 

质因数个数
题目描述:
求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入描述:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出描述:
对于每组数据,输出N的质因数的个数。
输入样例#:
120
输出样例#:
5
题目来源:
DreamJudge 1156

题目解析:我们可以通过上一节学会的素数筛选,先将所有的素数筛选出来。然后再不断的去分解素数,直到将数分解到1为止。由于我们的素数筛选只能到1000000,对于更大的素因子我们可以不继续分解,因为不会存在两个大于1000000的素因子,如果存在,那么这个数的范围一定大于题目所给的范围10^9。

 

参考代码

#include <bits/stdc++.h>  
using namespace std;  
  
// 线性素数筛选  prime[0]存的是素数的个数  
const int maxn = 1000000 + 5;  
int prime[maxn];  
void getPrime() {  
    memset(prime, 0, sizeof(prime));  
    for (int  i = 2; i <= maxn; i++) {  
        if (!prime[i]) prime[++prime[0]] = i;  
        for (int j = 1; j <= prime[0] && prime[j] * i <= maxn; j++) {  
            prime[prime[j] * i] = 1;  
            if (i % prime[j] == 0) break;  
        }  
    }  
}  
int main() {  
    getPrime();//先进行素数筛选预处理  
    int n;  
    while (scanf("%d", &n) != EOF) {  
        int ans = 0;  
        for (int i = 1; i <= prime[0]; i++) {  
            while (n % prime[i] == 0) {  
                n /= prime[i];  
                ans++;  
            }  
        }  
        if (n > 1) ans++;  
        printf("%d\n", ans);  
    }  
    return 0;  
}  

 

登录查看完整内容


课后作业

练习题目

DreamJudge 1284 整除问题


登录后开始许愿

暂无评论,来抢沙发