POJ2262题解
解题重点在如下几个地方
1> 快速判断一个数是不是素数
2> 找出某个数前后两个素数
3> 判断差是不是素数(找素数对部分代码的主要逻辑)
SOURCE
质量
Problem: 2262 User: 20132430222
Memory: 8836K Time: 657MS
Language: C++ Result: Accepted
源码
// 2262.cpp : 定义控制台应用程序的入口点。
//
//#include "stdafx.h"
#include<vector>
#include<iostream>
using namespace std;
struct MyStruct
{
char Flag;
int PrePrimeAddr;
};
struct MyStruct mylist[1000000]={{'0',0}};
int PrimeList[78500]={0};
void createPrimeList(int * list){
mylist[0].PrePrimeAddr=-1;
list[0] = 2;
mylist[1].Flag='1';
list[1] = 3;
mylist[1].PrePrimeAddr=0;
mylist[2].Flag='1';
list[2] = 5;
mylist[2].PrePrimeAddr=0;
mylist[3].PrePrimeAddr=1;
mylist[4].Flag='1';
list[3] = 7;
mylist[4].PrePrimeAddr=1;
mylist[5].PrePrimeAddr=2;
mylist[6].Flag='1';
mylist[6].PrePrimeAddr=2;
int len = 4;
int flag = 0;
for(int i=8;i<=1000000;i++){
for(int j = 0;((list[j]*list[j])<=i);j++){
if(i%list[j]==0){
flag = 1;
break;
}
}
if(flag == 0){
list[len] = i;
mylist[list[len]-1].Flag='1';
for(int tmp=list[len-1];tmp<list[len];tmp++){
mylist[tmp].PrePrimeAddr=len-1;
}
len++;
}else{
flag = 0;
}
}
for(int tmp=list[len-1];tmp<=1000000;tmp++){
mylist[tmp].PrePrimeAddr=len-1;
}
}
void print(int arg1,int arg2,int arg3){
cout<<arg1<<" = "<<arg2<<" + "<<arg3<<endl;
}
int main()
{
createPrimeList(PrimeList);
vector<int> input;
int tmp;
cin>>tmp;
while (tmp!=0){
input.push_back(tmp);
cin>>tmp;
}
//int tmparg3;
for(vector<int>::iterator it=input.begin();it!=input.end();++it){
tmp=(*it);
if(mylist[tmp-3].Flag=='1')
print(tmp,2,tmp-3);
else{
int i=mylist[tmp-3].PrePrimeAddr;
while(PrimeList[i]>=(tmp/2)){
if(mylist[tmp-PrimeList[i]-1].Flag=='1'){
print(tmp,tmp-PrimeList[i],PrimeList[i]);
break;
}
i--;
}
}
}
return 0;
}