URAL 1356 哥德巴赫猜想

简介:

题意:给出一个数,把它分解成几个素数相加的形式,要求分解出的素数的数量最小。

这题分情况讨论就可以了,首先需要知道哥德巴赫猜想即一个大于4的偶数可以分解成两个素数和的形式。其次需要知道奇数加奇数等于偶数,奇数减奇数等于偶数。

那么首先判断n是否是素数,如果是直接输出n就可以。

接下来判断如果n是奇数,那么先判断n-2是否是素数,如果是的话那么最小数量的素数和即n-2 与 2,如果不是那么肯定能减一个奇素数数得到一个偶数再分解成两个素数。这个奇素数首选肯定是3,因为3最小适合绝大多数情况。

如果n是偶数,那么直接分解成两个素数即可。 

分解偶数直接枚举素数暴力就可以了。这里数据弱了,n不大于maxn可行,不然还是得一个一个枚举。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
using namespace std;
#define maxn 100010
bool isprime[maxn];
int prime[maxn],nprime;
void getprime()
{
    memset(isprime,1,sizeof(prime));
    long long i,j;
    nprime=0;
    for(i=2; i<maxn; i++)
        if(isprime[i])
        {
            prime[nprime++]=i;
            for(j=i*i; j<maxn; j+=i)isprime[j]=0;
        }
}
bool judgeprime(int n)
{
    if(n<maxn)return isprime[n];
    int l=(int)sqrt(n*1.0);
    for(int i=0; prime[i]<=l; i++)
        if(n%prime[i]==0)return 0;
    return 1;
}
void divideeven(int n,int &x,int &y)
{
    for(int i=1; prime[i]<n; i++)
        if(judgeprime(n-prime[i]))
        {
            x=prime[i],y=n-x;
            return;
        }
}
int main()
{
    int t,n,x,y;
    getprime();
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        if(judgeprime(n))
        {
            printf("%d\n",n);
            continue;
        }
        if(n&1)
        {
            if(judgeprime(n-2))printf("2 %d\n",n-2);
            else divideeven(n-3,x,y),printf("3 %d %d\n",x,y);
        }
        else divideeven(n,x,y),printf("%d %d\n",x,y);
    }
    return 0;
}


目录
相关文章
|
8月前
USACO1.3 修理牛棚
USACO1.3 修理牛棚
UVa10484 - Divisibility of Factors(数论)
UVa10484 - Divisibility of Factors(数论)
73 1
|
算法
[USACO 2007 Jan S]Protecting the Flowers
[USACO 2007 Jan S]Protecting the Flowers
|
Windows
German Collegiate Programming Contest 2019 H . Historical Maths (二分 大数)
German Collegiate Programming Contest 2019 H . Historical Maths (二分 大数)
95 0
German Collegiate Programming Contest 2019 H . Historical Maths (二分 大数)
|
算法 测试技术
lecture 2.1 简单算法
(一)while循环 1. Convert the following into code that uses a while loop.
1132 0
数论 - SGU 107 987654321 problem
 987654321 problem Problem's Link   Mean:  略 analyse: 这道题目是道简单题.
787 0
|
人工智能
USACO/friday
Friday the Thirteenth 黑色星期五 描述 13号又是一个星期五。13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。给出N年的 一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400.
881 0
|
人工智能
哥德巴赫猜想证明
public class Guess { public static boolean isPrime(int i) { // 判断参数i是否是素数,是则返回true反之则返回false int n; boolean flag = true; if (1 == i) // 1本身不是素数,因此需把这个特殊的数字抛出 flag = false; for (n = 2; n &lt;= i -
1133 0