POJ 3006
2013-06-10 12:27
204 查看
题目大意:等差数列,要求分别输入首项a,差值d,以及n(n为输出的的第n个素数)。
方法:先用筛选法列出2--1000000的素数表,再利用prime[a+i*d]判断a+i*d是否为素数即可。用j记录素数数目,当j==n是输出即可。(筛选法详见POJ
2262)
于是,贴代码:
#include<stdio.h>
#define MAX
1000001
int prime[MAX]={0};
void getprime()//筛选法筛选素数,制成素数表
{
int i,j;
prime[0]=prime[1]=1;
for(i=2;i<=MAX/2;i++)
if(!prime[i])
for(j=2;i*j<MAX;j++)
prime[i*j]=1;
}
int main()
{
int a,d,n,i,j;
getprime();
while(scanf("%d %d %d",&a,&d,&n)&&(a!=0||d!=0||n!=0))
{
for(i=0,j=0;a+i*d<MAX;i++)
{
if(!prime[a+i*d])j++;//直接对应素数表效率高
if(j==n)break;
}
printf("%d\n",a+i*d);
}
return 0;
}
以上。。。
方法:先用筛选法列出2--1000000的素数表,再利用prime[a+i*d]判断a+i*d是否为素数即可。用j记录素数数目,当j==n是输出即可。(筛选法详见POJ
2262)
于是,贴代码:
#include<stdio.h>
#define MAX
1000001
int prime[MAX]={0};
void getprime()//筛选法筛选素数,制成素数表
{
int i,j;
prime[0]=prime[1]=1;
for(i=2;i<=MAX/2;i++)
if(!prime[i])
for(j=2;i*j<MAX;j++)
prime[i*j]=1;
}
int main()
{
int a,d,n,i,j;
getprime();
while(scanf("%d %d %d",&a,&d,&n)&&(a!=0||d!=0||n!=0))
{
for(i=0,j=0;a+i*d<MAX;i++)
{
if(!prime[a+i*d])j++;//直接对应素数表效率高
if(j==n)break;
}
printf("%d\n",a+i*d);
}
return 0;
}
以上。。。
相关文章推荐
- poj 1276 Cash Machine
- poj&nbsp;1603&nbsp;Risk(floyd)
- poj 3667 Hotel
- poj&nbsp;1422&nbsp;Air&nbsp;Raid(匈牙利&nbsp;DAC图最…
- poj 1436 Horizontally&…
- poj&nbsp;1014&nbsp;Dividing(多重背包)
- poj&nbsp;1177&nbsp;Picture(线段树+离散化+…
- poj&nbsp;3177&nbsp;Redundant&nbsp;Paths&nbsp;(双连…
- poj&nbsp;2112&nbsp;Optimal&nbsp;Milking(floyd+…
- poj&nbsp;2960&nbsp;S-Nim(博奕)
- POJ&nbsp;2000
- poj 1062 最短路
- poj 1797
- poj 3159 差分约束+最短…
- POJ 2262 Goldbach's Conjecture(…
- POJ 1658 Eva's Problem(水到极点)
- poj 1252_完全背包
- ACM: 广搜+素数 poj 3126 (素数表…
- ACM: 最优解 dp题 poj 1260
- ACM: 匈牙利算法 图论题 poj 3041 …