Summation of Four Primes(歌德巴赫猜想)

Summation of Four Primes

题目链接:click here~

题目要求:

给出一个整数要你将其拆成由四个素数组成的数。如果,不能拆则输出“Impossible.”

思路解析:

根据题目给出的两个猜想,可以得到。如果,一个数是奇数的话则其一定可以拆成一个奇数+一个偶数的形式,而一个数是偶数的话可拆的就有两种奇数+奇数/偶数+偶数。而Waring的猜想是一个奇数可以拆成3个素数,所以显然题目给出的一个整数是奇数的时候我们就不能保留奇数拆偶数了。我们应该一开始就把奇数拆成两个素数,然后再拆偶数,而一个偶数可以拆成两个素数是猜想给出的,所以我们可以认为其实正确的。同理,当给出的数是偶数的时候,我们只能是保留两个偶数的形式,且可以一开始就把一个偶数给拆成两个素数的形式。然后,遍历另外一个偶数。而一个为n的整数内的素数个数为n/ln(n)。所以,算法总时间为O(n/ln(n));

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

const int MAXN = 10000000+10;
int top,prim[700000];
bool vst[MAXN];
void Isprim()
{
    top = 0;
    memset(vst,0,sizeof(vst));
    vst[0] = vst[1] = 1;
    for(int i = 2;i < MAXN;++i)if(!vst[i]){
        prim[top++] = i;
        for(int j = i+i;j < MAXN;j += i)vst[j] = 1;
    }
}
void output(int n)
{
    for(int i = 0;i < top&&prim[i] < n;++i){
       if(!vst[n-prim[i]]){
          cout<<prim[i]<<" "<<n-prim[i]<<endl;
          break;
       }
    }
}
int main()
{
   Isprim();
   //test
//   cout<<"top: "<<top<<endl;
   int n;
   while(cin>>n)
   {
       if(n<8){
          cout<<"Impossible."<<endl;
          continue;
       }

       if(n&1){
          cout<<"2 "<<"3 ";
          n -= 5;
          output(n);
       }
       else{
           cout<<"2 "<<"2 ";
           n -= 4;
           output(n);
       }
   }
   return 0;
}



Summation of Four Primes(歌德巴赫猜想)

时间: 2024-10-16 20:22:07

Summation of Four Primes(歌德巴赫猜想)的相关文章

uva 10168 Summation of Four Primes(数论-哥德巴赫猜想)

Problem A Summation of Four Primes Input: standard input Output: standard output Time Limit: 4 seconds Euler proved in one of his classic theorems that prime numbers are infinite in number. But can every number be expressed as a summation of four pos

UVA 10168 Summation of Four Primes(数论)

Summation of Four Primes Input: standard input Output: standard output Time Limit: 4 seconds Euler proved in one of his classic theorems that prime numbers are infinite in number. But can every number be expressed as a summation of four positive prim

歌德巴赫猜想

/* 2000以内的不小于4的正偶数都能分解成两个素数之和(验证这个猜想的正确性) */ #include <stdio.h> #include <stdlib.h> #include<math.h> int prime(int m); /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int mai

使用C程序验证歌德巴赫猜想

就是一个足够大的偶数可以写成两个素数的和 1 #include<stdio.h> 2 #include<math.h> 3 4 int main(void) 5 { 6 int i,j; 7 int num=30284; //任意大于6的偶数 8 int p,q; 9 int flagp,flagq; 10 11 p=1; 12 do 13 { 14 p=p+1; 15 q=num-p; 16 flagp=1; 17 flagq=1; 18 19 for(i=2;i<sqrt

hihocoder offer收割编程练习赛12 A 歌德巴赫猜想

思路: 枚举. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 6 const int MAX_N = 1000005; 7 8 int prime[MAX_N]; 9 bool is_prime[MAX_N + 1]; 10 11 int init(int n) 12 { 13 int p = 0; 14 for (int i =

歌德巴赫猜想的证明

输入代码: /* *Copyright (c)2014,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:sum123.cpp *作 者:林海云 *完成日期:2014年12月30日 *版 本 号:v2.0 * *问题描述:写一个函数gotbaha, 验证"每个不小于6的偶数都是两个奇素数之和",输入一个不小于6的偶数n,找出两个素数,使它们的和为n. *程序输入: 一个不小于6的偶数n *程序输出: 符合要求的两个素数 */ #include<

[Offer收割]编程练习赛12 题目1 : 歌德巴赫猜想

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 哥德巴赫猜想认为"每一个大于2的偶数,都能表示成两个质数之和". 给定一个大于2的偶数N,你能找到两个质数P和Q满足P<=Q并且P+Q=N吗? 输入 一个偶数N(4 <= N <= 1000000) 输出 输出P和Q.如果有多组解,输出P最小的一组. 样例输入 10 样例输出 3 7 思路 判断和为N两个数是否为素数 代码 1 import java.util.Scanner; 2 3 pu

验证歌德巴赫的猜想

歌德巴赫猜想的近似证明 歌德巴赫猜想是说任何一个大于2的偶数都能表示为两个素数之和,请编写一个Java程序,验证1-100内歌德巴赫猜想的正确性. 自己写的一个小程序,代码可能不够简洁,如有错误,请大家指正一下: import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; /** * 歌德巴赫猜想的近似证明 歌德巴赫猜想是说任何一个大于2的偶数都能表示为两个素数之和, * 请编写一个Java

[转]100个经典C语言程序(益智类问题)

目录: 1.绘制余弦曲线 2.绘制余弦曲线和直线 3.绘制圆 4.歌星大奖赛 5.求最大数 6.高次方数的尾数 8.借书方案知多少 9.杨辉三角形 10.数制转换 11.打鱼还是晒网 12.抓交通肇事犯 13.该存多少钱 14.怎样存钱利最大 15.捕鱼和分鱼 16.出售金鱼 1.7 分数四则运算 17.平分七筐鱼 18.有限5位数 19. 8 除不尽的数 21.4位反序数 22.求车速 23.阿姆斯特朗数 24.完全数 26.亲密数 27.自守数 28.回文数 29.求具有abcd=(ab+c