【九度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 日

posted @ 2017-03-07 18:54  负雪明烛  阅读(26)  评论(0编辑  收藏  举报