HOJ MaoLaoDa Number

来源:互联网 发布:思迅天店软件免费下载 编辑:程序博客网 时间:2024/06/05 19:07
/*
 * File:   main.cpp
 * Author: 6100300115
 * Created on 2012年2月28日, 下午4:09
 */
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
const int MAX = 46500;

int pri[MAX];

int size;

/*
 * 题意:任意给你一个数,问你他能否分解成两个素数之积。
 * 所给出数的大小在:int有符号数的范围内
 * 那么开根号小于:46500
 * 即任何一个数不可能是大于46500的两个素数之乘积。
 * 实际上46500以内的素数已经很少了,
 * 那么我们就让此数除以46500内小于其开根号的所有素数,
 * 如果无一整除,那么此数必然是一个素数,不满足情况。
 * 如果能被其中一个整除,那么只需判断另一个是否是素数
 * 即可,先试一下同上的判断方法,因为复杂度不是很高。
 * 如果还不行就用费马小定理。
 */
void find_prime() {
    pri[0] = 2;
    pri[1] = 3;
    size = 2;
    bool judge;
    for (int i = 4; i < MAX; i++) {
        judge = false;
        for (int j = 0; pri[j] * pri[j] <= i; j++) {
            if (i % pri[j] == 0) {
                judge = true;
                break;
            }
        }
        if (judge)continue;
        pri[size++] = i;
    }
}
bool judge_prime(int n) {
    for (int i = 0; pri[i] * pri[i] <= n; i++) {
        if (n % pri[i] == 0) {
            return false;
        }
    }
    return true;
}
int main() {
    //    cout << sqrt(2147483647.0) << endl;
    find_prime();
    int n;
    bool judge;
    while (scanf("%d", &n) != EOF) {
        judge = false;
        for (int i = 0; (long long) pri[i] * pri[i] <= (long long) n; i++) {
            if (n % pri[i] == 0) {
                if (judge_prime(n / pri[i]) == true) {
                    judge = true;
                }
                break;
            }
        }
        if (judge == true) {
            printf("Yes\n");
        } else {
            printf("No\n");
        }
    }
    return 0;
}