【九度OJ】题目1207:质因数的个数 解题报告
【九度OJ】题目1207:质因数的个数 解题报告
标签(空格分隔): 九度OJ
原题地址:http://ac.jobdu.com/problem.php?pid=1207
题目描述:
求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出:
对于每组数据,输出N的质因数的个数。
样例输入:
120
样例输出:
5
提示:
注意:1不是N的质因数;若N为质数,N是N的质因数。
Ways
这个题同样采用素数筛法,首先求得1-1000000之间的所有素数放到prime中,然后依次进行除法测试,看能不能整除,如果能整除则一直整除下去,并且记录除了多少次。
注意,为什么输入数字的范围是10^9,但是存储素数时只保存了100000个呢?是因为sqrt(n)的复杂度原因。也就是说这个范围内的整数所包含的最大素数因子在10^5-10^9之间最多只有一个。因此,遍历1-10^5之间的素数,如果剩余的n不是1,说明含有大于10^5的素数因子,但这个因子只有1个。
#include <stdio.h>
int prime[1000001];//2,3,5,7...
int flag[1000001];
int size;
void init() {
size = 0;
for (int i = 1; i <= 1000000; i++) {
flag[i] = false;
}
for (int i = 2; i <= 1000000; i++) {
if (flag[i]) {
continue;
}
prime[size++] = i;
if (i >= 10000) continue;
for (int j = i * i; j <= 1000000; j += i) {
flag[j] = true;
}
}
}
int main() {
init();
int n;
while (scanf("%d", &n) != EOF) {
int count = 0;
for (int i = 0; i < size && n != 1; i++) {//注意两个循环条件,
while (n % prime[i] == 0) {//遍历所有素数
n /= prime[i];//如果能整除,就一直整除到不能再整除
count++;//每整除一次,count++
}
}
if (n != 1) {//包含大于10^5的因子,案分析最多只有一个这样的因子
count++;
}
printf("%d\n", count);
}
return 0;
}
没错!又可以用BigInteger类!下面这个方法我测试的时候感觉是对的,可是在OJ上运行的时候,LTE,超时。说明nextProbablePrime()的确很耗时间,在OJ上很不占优势。
import java.util.*;
import java.math.*;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
BigInteger n = scanner.nextBigInteger();
BigInteger x = new BigInteger("2");
int count = 0;
while (x.intValue() < 100000 && n.intValue() != 1) {
while (n.remainder(x).intValue() == 0) {//不小心写成了if
n = n.divide(x);
count++;
}
x = x.nextProbablePrime();
}
if (n.intValue() != 1) {
count++;
}
System.out.println(count);
}
}
}
Date
2017 年 3 月 7 日