您的位置:首页 > 其它

zoj 2723 Semi-Prime

2013-07-23 16:27 393 查看
// 题意都不好理解 我以为是求 一个数被分成2个素数和  然后是求分成2个素数积
// 坑爹 忘记写 !=EOF 然后一直超时  然后换了几种  还是超时  一看别人代码 速度明显比我慢
// 然后发现被自己坑了

#include <iostream>
#include <math.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxm 10010
#define maxn 1000010
int gcd(int a,int b){
int r;
while(r=a%b){a=b;b=r;}
return b;
}
bool isp(int n){
if(n==2) return true;
if(n%2==0||n==1) return false;
int m=(int)(sqrt(n+1.0));
for(int i=3;i<=m;i+=2)
if(n%i==0) return false;
return true;
}
int fun(int n){
int m,i;
if(n%2==0){
if(isp(n/2))
return 1;
else
return 0;
}else{
int k;
m=(int)(sqrt(n+1.0));
k=0;
for(i=3;i<=m;i+=2)
if(n%i==0){
if(isp(i)&&isp(n/i))
{
return k=1;
// printf("Yes\n");
break;
}
}
if(!k) return 0; //printf("No\n");
}
}
int main()
{
int n;
int m;
int i,k;

while(scanf("%d",&n)!=EOF){
if(fun(n)) printf("Yes\n");
else printf("No\n");
}

return 0;
}


// 郁闷 求出所有素数 还是不如上述快

#include <iostream>
#include <math.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxm 10010
#define maxn 1000010
int prim[maxn/3],p;
bool f[maxn];
int gcd(int a,int b){
int r;
while(r=a%b){a=b;b=r;}
return b;
}
bool isp(int n){
if(n==2) return true;
if(n%2==0||n==1) return false;
int m=(int)(sqrt(n+1.0));
for(int i=3;i<=m;i+=2)
if(n%i==0) return false;
return true;
}
int getprime(){
int i,j;
f[1]=true;
for(i=4;i<=maxn;i+=2)
f[i]=true;
int m=(int)(sqrt(maxn+1.0));
for(i=3;i<=m;i+=2){
for(j=i*i;j<=maxn;j+=i)
f[j]=true;
}
for(i=1;i<=maxn;i++)
if(!f[i]) prim[p++]=i;
}
int main()
{
int n;
int m;
int i,k;
getprime();
while(scanf("%d",&n)!=EOF){
m=(int)(sqrt(n+1.0));
k=i=0;
while(prim[i]<=m){
if(n%prim[i]==0&&!f[n/prim[i]])
{
k=1;
break;
}
i++;
}
if(!k) printf("No\n"); else printf("Yes\n");
}

return 0;
}





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: