⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1397 goldbach's conjecture.cpp

📁 ACM 威士忌部分答案
💻 CPP
字号:
/*
1397 Goldbach's Conjecture
Time Limit : 1000 ms  Memory Limit : 32768 K  Output Limit : 256 K

968 MS 316 KB 1438 B
GUN C++
*/
//暴力穷举,注意要优化
//可用筛法
#include <iostream.h>
#include <stdio.h>
#include <math.h>
using namespace std;

const int nMax=32768;
const int pMax=3600;

int prime[pMax]={0},now;

bool isPrime(int num)
{
    int rnum,ca;
    rnum=(int)sqrt(num);
    for(ca=2;ca<=rnum;ca++)
    {
        if(num%ca==0)
        {   return false;}
    }
    return true;
}

int divFind(int num)
{
    int low=0,high=now,mid;
    while(high-low>=0)
    {
        mid=(low+high)/2;
        if(prime[mid]==num)
            return mid;
        else
        {
            if(prime[mid]>num)
            {   high=mid-1;}
            else
            {   low=mid+1;}
        }
    }
    return -1;
}

int main()
{
    int n,ca,pos,count,temp;
    
    for(ca=2,now=0;ca<=nMax;ca++)
    {
        if(isPrime(ca))
        {   prime[now]=ca;now++;}
    }
    now--;
    
    while(scanf("%d",&n) && n!=0)
    {
        temp=(int)ceil(n/2.0);
        count=0;
        for(pos=0;pos<=now;pos++)//防止重复的计算
        {
            if(prime[pos]>temp)
                break;
            if(prime[pos]==temp)//相等时,是一种答案
            {   count++;break;}
        }
        
        for(ca=0;ca<pos;ca++)
        {
            if(divFind(n-prime[ca])>0)
                count++;
        }
        printf("%d\n",count);
    }
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -