hdu5104——Primes Problem(素数)

Primes Problem

 

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3384    Accepted Submission(s): 1515

 

 

Problem Description

Given a number n, please count how many tuple(p1, p2, p3) satisfied that p1<=p2<=p3, p1,p2,p3 are primes and p1 + p2 + p3 = n.

 

 

Input

Multiple test cases(less than 100), for each test case, the only line indicates the positive integern(n≤10000).

 

 

Output

For each test case, print the number of ways.

 

 

Sample Input

 

3 9

 

 

Sample Output

 

0

2

 

题意:给一个数n,问有多少种三个素数的组合,使三个素数的和等于n; 其中 如 2 2 5 和 2 5 2 以及 5 2 2是重复的

思路,素数打表,先枚举两个素数,算n减去他们的和是否也是素数,但是这样会产生重复,因为枚举的次序是从小到大的,因此设n-prime[i]-prime[j]>prime[j]为去重条件,使n-prime[i]-prime[j]为加数中最大的素数,避免了2 2 5和 2 5 2 重复这样的事发生

#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <queue> 
#include <cmath> 
#include <algorithm> 
#include <vector> 
#include <map> 
#include <string> 
#include <stack> 
using namespace std; 
typedef long long ll; 
#define PI 3.1415926535897932 
#define E 2.718281828459045 
#define INF 0x3f3f3f3f 
#define mod 1000000007 
#define N 1000005 
bool isprime[N]; 
ll prime[N]; 
int cnt; 
void getpri() {     
ll i;     
int j;     
cnt=0;     
memset(isprime,false,sizeof(isprime));     
for(i=2; i<1000000LL; i++)     
{         
if(!isprime[i])prime[cnt++]=i;         
for(j=0; j<cnt&&prime[j]*i<1000000LL; j++)         
{             
isprime[i*prime[j]]=1;             
if(i%prime[j]==0)break;         
}     
} 
} 
int main() {     
int i,j,k,t;     
getpri();     
//printf("%I64d\n",prime[550]);     
k=0;     
for(i=0; i<1000; i++)         
for(j=i+1; j<1000; j++)         
{             
sum[k++]=prime[i]+prime[j];             
//has[sum[k-1]]=1;         
}     
//sort(sum,sum+k);     
//for(i=0;i<100;i++)     
//printf("%d\n",sum[i]);     
t=k;    
for(i=0; i<10000; i++)sum[k++]=3*prime[i];     
//printf("%d\n",sum[i]);     
//printf("%d %d\n",i,isprime[i]);     
isprime[0]=isprime[1]=1;     
while(scanf("%d",&n)!=EOF)     
{         
int cnt=0;         
for(i=0; prime[i]<n; i++)         
{             
for(j=i; prime[j]<n; j++)             
{                 
if(!isprime[n-prime[i]-prime[j]]&&(n-prime[i]-prime[j])>=prime[j])                     cnt++;             
}         
}         
printf("%d\n",cnt);     
}     
return 0; 
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值