您的位置:首页 > 其它

URAL - 1356

2017-09-06 14:00 316 查看
哥德巴赫猜想:任一大于2的偶数都可写成两个质数之和,任一大于7的奇数都可写成三个质数之和的猜想

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1397

题目大意:给出一个数n,把他分解成两个素数的和,求方案数

解题思路:暴力

AC代码:

#include<cstdio>
using namespace std;

const int MAXN = (1 << 15) + 5;

int prime[MAXN], tot = 0;
bool vis[MAXN];

void toInit()
{
for (int i = 2;i < MAXN;++i)
{
if (!vis[i])
prime[tot++] = i;
for (int j = 0;j < tot&&i*prime[j] < MAXN;++j)
{
vis[i*prime[j]] = 1;
if (i%prime[j] == 0) break;
}
}
}

int main()
{
toInit();
for (int n;scanf("%d", &n) == 1 && n;)
{
int ans = 0;
for (int i = 0;prime[i] <= n / 2 && i < tot;++i)
if (!vis[n - prime[i]])
ans++;
printf("%d\n", ans);
}
return 0;
}


题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1356

题目大意:给出一个数,如果本身是素数,输出本身。如果不是素数,如果能由两个素数相加构成,输出这两个素数,如果能由三个素数构成,输出这3个素数。

解题思路:对于n,如果n是偶数且大于等于4,那么他一定能表示成两个素数的和,如果n是奇数,如果他由两个素数相加构成,那么其中一个素数一定是2,假设不是2,那么任意两个奇数相加一定是偶数,矛盾(素数除了2,其他都是奇数),如果他由3个数相加构成,假设其中一个数是2,那么减去2之后还是奇数且还是合数,那么一定是由2和另一个素数相加构成。如果构成的数中不存在2,暴力判断。

AC代码:

#include<cstdio>
using namespace std;

bool isPrime(int n)//6素数判断法
{
if (n <= 3)
return n > 1;
if (n % 2 == 0 || n % 3 == 0)
return false;
for (int i = 5;i*i <= n;i += 6)
if (n%i == 0 || n % (i + 2) == 0)
return false;
return true;
}

void toCal(int n)
{
if (n == 1 || isPrime(n))
printf("%d\n", n);
else
{
if (isPrime(n - 2))
printf("%d %d\n", 2, n - 2);
else
{
if (n % 2 == 0)
{
for (int i = 3;i * 2 <= n;i += 2)//i表示最小的一个
if (isPrime(i) && isPrime(n - i))
{
printf("%d %d\n", i, n - i);
return;
}
}
else
{
if (isPrime(n - 4))
printf("%d %d %d\n", 2, 2, n - 4);
else
{
for (int i = 3;i * 3 <= n;i += 2)//i表示最小的一个
for (int j = i;j * 2 <= n - i;j += 2)
if (isPrime(i) && isPrime(j) && isPrime(n - i - j))
{
printf("%d %d %d\n", i, j, n - i - j);
return;
}
}
}
}
}
}

int main()
{
int t;scanf("%d", &t);
while (t--)
{
int n;scanf("%d", &n);
toCal(n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: