uva 10168 【素数筛法】

来源:互联网 发布:爱温士采暖知乎 编辑:程序博客网 时间:2024/06/15 00:21


题意:



题解:



代码:


#include<iostream>#include<string>#include<string.h>using namespace std;bool u[10000001];int su[5000000],num;void prepare(){int i,j;memset(u,true,sizeof(u));for(i=2;i<=9999999;i++){if(u[i]) su[++num]=i;for(j=1;j<=num;j++){if(i*su[j]>9999999) break;u[i*su[j]]=false;if(i%su[j]==0) break;}}}int main(){prepare();int n,i,j,k;while(cin>>n){if(n==8){ cout<<"2 2 2 2"<<endl; continue;}if(n==9){ cout<<"2 2 2 3"<<endl; continue;}if(n==10){ cout<<"2 2 3 3"<<endl; continue;}if(n==11){ cout<<"2 3 3 3"<<endl; continue;}if(n==12){ cout<<"3 3 3 3"<<endl; continue;}if(n<8){ cout<<"Impossible."<<endl; continue;}if(n%2==0) {cout<<"2 2 ";n-=4; }//先分出头两项else {cout<<"2 3 "; n-=5;}for(i=1;i<=num;i++) //问题又转换为找一个最大和最小的{if(su[i]*2>n) break;if(u[n-su[i]]){cout<<su[i]<<" "<<n-su[i]<<endl;break;}}}return 0;}