题目链接:http://codeforces.com/problemset/problem/584/D
题意:
给一个奇数将其拆分成1个2个或者3个素数的和。
暴力也要有点技巧...
不过也的确没想到这题暴力写就可以过,大概还是缺少经验吧...
分几种情况讨论一下
1、只输出一个数,n本身就是素数,直接输出。
2、输出两个素数,由于n是奇数,那么拆分后一定是奇数+偶数,而偶数中只有2是素数,所以只需判断n - 2是否为素数。
3、输出三个素数,分两种情况:
1)偶数+偶数+奇数,也就是2 、2 、n - 4,这样只需判断n - 4是否为素数。
2)三个奇数,这就需要暴力求解了。 据说有一个数学规律 在小于10^9的素数中相邻两个素数之间的的距离不会超过300
知道这个规律就可以大胆的暴力了。
参考博客:http://blog.csdn.net/yanghui07216/article/details/51287041 感谢!!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <cmath>
using namespace std;
int isprime(int x) {
int i;
if(x < 2) return 0;
for(i = 2; i <= sqrt(x); i++) {
if(x % i == 0) return 0;
}
return 1;
}
int main() {
int n;
scanf("%d", &n);
if(isprime(n)) {
printf("1\n%d\n", n);
}
else if(isprime(n - 2)) {
printf("2\n2 %d\n", n - 2);
}
else if(isprime(n - 4)) {
printf("3\n2 2 %d\n", n - 4);
}
else {
int i, j;
for(i = n - 6; i >= 2; i -= 2) {
if(isprime(i)) {
int tmp = n - i;
for(j = 3; j <= tmp / 2; j += 2) {
if(isprime(j) && isprime(tmp - j)) {
printf("3\n%d %d %d\n", i, j, tmp - j);
return 0;
}
}
}
}
}
return 0;
}