原题链接:http://poj.org/problem?id=3006
定位:水题一枚,练手,找感觉
思路:
打脸的地方在于,sqrt(n),在poj的判题系统里面n必须是double类型的,否则出编译错误
'sqrt' : ambiguous call to overloaded function
所以这里必须改成sqrt((double)n)。
其实很多时候,codeblocks等IDE帮我们做了许多事情,也默认了我们许多不严谨的写法,最普遍的就是某些头文件不加也行了,可是oj判题系统是不会这么贴心的,因此,写题的姿势是特别重要的。
其实完全可以用i*i<n的。
另外,不推荐用sqrt,很慢,而且精度不高的,要是有一些高精度的数据,就杯具了。
代码附上:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
bool is_prime(int n)
{
bool prime=true;
int i;
int k=(int)sqrt((double)n);
if(n<=1) prime=false;
for(i=2;i<=k;i++)
{
if(n%i==0)
{
prime=false;
break;
}
}
return prime;
}
int main()
{
int a,b,n,count=0;
scanf("%d%d%d",&a,&b,&n);
while(a!=0&&b!=0)
{
for(int i=0;I!=n;i++)
{
if(is_prime(a+i*b))
{
count++;
}
if(count==n)
{
printf("%d\n",a+i*b);
break;
}
}
scanf("%d%d%d",&a,&b,&n);
count=0;
}
return 0;
}
235ms,对于这种水题来说很不理想
#include <cstdio>
#include <iostream>
bool a[1000001];
void prime1()
{
int i=0,k=0;
memset(a,false,sizeof(a));
a[1]=true;
for(i=2;i<=1001;i++)
{
if(!a[i]){
k=i*i;
while(k<=1000001){
a[k]=true;
k+=i;
}
}
}
}
int main()
{
prime1();
int b,d,n,i;
while(scanf("%d%d%d",&b,&d,&n))
{
if(b==0 || d==0 || n==0)
break;
b=b-d;
while(n>0)
{
b=b+d;
if(!a[b]) n--;
}
printf("%d\n",b);
}
return 0;
}
这是转载的别人的,32ms,果然是打表更快。