哪位大神稍微帮小弟我看一上,求素数 结果超时
哪位大神稍微帮我看一下,求素数 结果超时
#include <iostream>
using namespace std;
int main()
{
int times;
cin>>times;
for(int i=0;i<times;++i){
int p,q;
cin>>p;
cin>>q;
int sum=0;
if(p<=2){sum++;}
for(int j=(p%2==0?(p+1):p);j<=q;){
bool bl=1;
for(int h=3;h*h<=j;h+=2){
if(j%h==0) {
bl=0;
break;
}
}
if(bl&&j>2){
sum++;
j+=2;
}else{++j;}
}
cout<<sum<<endl;
}
system("pause");
return 0;
}
------解决方案--------------------
比较快的素数算法一搜一大把,随便贴一个好了.
#include <iostream>
using namespace std;
int main()
{
int times;
cin>>times;
for(int i=0;i<times;++i){
int p,q;
cin>>p;
cin>>q;
int sum=0;
if(p<=2){sum++;}
for(int j=(p%2==0?(p+1):p);j<=q;){
bool bl=1;
for(int h=3;h*h<=j;h+=2){
if(j%h==0) {
bl=0;
break;
}
}
if(bl&&j>2){
sum++;
j+=2;
}else{++j;}
}
cout<<sum<<endl;
}
system("pause");
return 0;
}
------解决方案--------------------
比较快的素数算法一搜一大把,随便贴一个好了.
- C/C++ code
#include <iostream> #include <windows.h> using namespace std; unsigned int prime(unsigned int lmax) { bool* prime_num = new bool[lmax]; memset(prime_num, true, sizeof(bool) * lmax); for (unsigned int i = 2; i < lmax; ++i) { if (prime_num[i]) for (unsigned int j = 2; i * j < lmax; ++j) prime_num[i * j] = false; } unsigned int pnum = 0; for (unsigned int i = 2; i < lmax; ++i) { if (prime_num[i]) ++pnum; } delete[] prime_num; return pnum; } int main() { int a = 1000000000; DWORD s = GetTickCount(); unsigned int pnum = prime(1000000000); float use_time = ((float)(GetTickCount() - s)) / 1000.f; cout<<"1000000000 以内有素数个数 : "<<pnum<<endl; cout<<"用时 : "<<use_time<<"秒"<<endl; return 0; }