题解 | #质因数的个数#
质因数的个数
https://www.nowcoder.com/practice/20426b85f7fc4ba8b0844cc04807fbd9
#include<iostream> #include<cmath> #include<vector> using namespace std; /*预先筛选题面数据范围内的素数 * 题面范围N,筛选到maxN=sqrt(N)+1 * 原因: * N最多存在一个>maxN的质因数(否则两个大于maxN的质因数乘起来>N) * 只需将<=maxN的素因数从n中去除 * 剩余的部分必为>maxN的质因数(至多有一个) * 不必测试maxN到n的素数 * 如果除完<maxN的素因数后,n>1; * 表明n存在一个大于MAXN的因子且为质因子 * 其幂指数也必定为1 */ /*对于输入n * 1 遍历<n的素数,判断是否为n的因数 * 2 确定某素数是因数 * 3 试除,确定幂指数 */ const int N = 1e9; //const int maxN=sqrt(N)+1; //就会报错,有很大问题 const int maxN = 31623; vector<int> prime; bool isPrime[31623]; //如果用注释的那种方法会报错: //error: array bound is not an interger constant before ']' token void Initial() { //初始化isPrime数组,和prime向量 for (int i = 0; i < maxN; i++) { isPrime[i] = true; } isPrime[0] = false; isPrime[1] = true; for (int i = 2; i < maxN; i++) { if (isPrime[i] == true) { prime.push_back(i); for (int j = i * i; j < maxN; j += i) { isPrime[false]; } } } return ; } int main() { Initial(); int n; while (scanf("%d", &n)!=EOF) { int answer = 0; int total = prime.size(); for (int i = 0; prime[i] < n && i < total; i++) { if (n % prime[i] == 0) { n /= prime[i]; answer++; while (n % prime[i] == 0) { //继续试除 n /= prime[i]; answer++; } } } if (n > 1) { answer++; } printf("%d\n", answer); } return 0; }
error: variable length array declaration not allowed at file scope
array bound is not an interger constant before ']' token
注意全局变量数组长度的定义!!(在dev-c++上面能过有些OJ也有可能出问题)