使用的题目是poj的2739
这个打表方法用的是老师的
int prime[5005],x;
void find(int N){
x=0;
prime[x]=2;
int n=prime[x];
while(n<=N){
int flag=1;
n=n+1;
for(int j=0;j<=x;j++){
if(n%prime[j]==0){
flag=0;
break;
}
}
if(flag==1){
x++;
prime[x]=n;
}
}
}
稍微改进下
void find(int N){
x=0;
prime[x]=2;
for(int i=2;i<=N;i++){
int flag=1;
for(int j=0;j<=x;j++){
if(i%prime[j]==0){
flag=0;
break;
}
}
if(flag==1){
x++;
prime[x]=i;
}
}
}
参考了下线性筛选法——欧拉筛法
#include <stdio.h>
#include <string.h>
#define MAXN 100000
#define MAXL 1000000
int prime[MAXN];
_Bool check[MAXL];
int main(void)
{
int n, count;
while (~scanf("%d", &n))
{
memset(check, 0, sizeof(check));
count = 0;
for (int i = 2; i <= n; i++)
{
if (!check[i])
prime[count++] = i;
for (int j = 0; j < count; j++)
{
if (i*prime[j] > MAXL)
break; // 过大的时候跳出
check[i*prime[j]] = 1;
if ((i%prime[j]) == 0) // 如果i是一个合数,而且i % prime[j] == 0
break;
}
}
for (int i = 0; i < count; i++)
printf("%d\n", prime[i]);
}
return 0;
}
感觉好像类似???
我觉得老师的方法挺好用的。我决定用老师的
自己在重复一次加深印象
#include<iostream>
using namespace std;
int prime[5005],x;
void find(int N){
x=0;prime[x]=2;
for(int i=2;i<=N;i++){
int flag=0;//标记是否为素数
for(int j=0;j<=x;j++){
if(i%prime[j]==0){//能被之前的素数整除
flag=1;
break;
}
}
if(flag==0){
prime[++x]=i;
}
}
}
int main(){
int n;
while(cin>>n&&n){
find(n);
int count=0;
for(int i=0;i<=x;i++){
int sum=0;
for(int j=i;j<=x;j++){
sum+=prime[j];
if(sum==n){
count++;
break;
}
}
}
cout<<count<<endl;
}
return 0;
}
这题是POJ 2739的完整解答 find 方法就是素数打表法