/*
* 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有符号数的范围内
* 那么开根号小于: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;
}
* 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;
}