#include<iostream>
#include<map>
#include<algorithm>
#include<math.h>
using namespace std ;
map< long long int , long long int > prim ;
map< long long int , long long int >::iterator it ;
int c, counter, check ;
long long int b ;
int prime( long long int t)
{
if( t==1 )
{
prim[1] = 1 ;
counter = 1 ;
it=prim.begin() ;
//cout<< it->second ;
return 1 ;
}
else
{
check = -1 ;
long long int f ;
f= int(sqrt(t)) ; // could create prob
for( it=prim.begin() ; it!= prim.end() || it->second <=f ; it++)
{
if( (t % (it->second))==0 && it->second != 1 )
{
cout << "not prime " << "\n" ;
check = 0 ;
// not prime
break ;
}
}
if(check==-1)
{
// prime ;
counter ++ ;
prim[counter] = t ;
return 1 ;
}
else if(check==0)
return 0 ;
}
}
int main()
{
int check2 ;
check2 = 1 ; // value set 1 to call it prime
cout<< "input no ";
cout<<"\n";
cin >>b ;
for( long long int z=1 ;z <=int(sqrt(b)); z++ )
{
c = prime(z) ;
//cout<<"z is "<<z <<"\n";
if ( c==1 && z!=1 )
{
if((b%z) == 0)
{
//cout<< "not prime " ;
check2 = 0 ;
break ;
}
}
}
if(check2!=0)
{
cout<<"\n";
cout<< "prime" ;
}
else
cout<< "not prime " ;
for( it=prim.begin() ; it!= prim.end() ; it++)
{
cout<<"\n" ;
cout<< it->first ;
cout<< it->second ;
cout<< " \n" ;
}
return 0 ;
}
好吧,我在200以上的数字方面遇到问题,而且这些都是素数问题。程序没有正确执行给出意外的值。
如果你们能告诉我有关错误或更好的方法来生成质数图,请做!
答案 0 :(得分:1)
以下是模板希望它有所帮助,如果你必须从1生成所有素数,它需要 O(nlog(logn))时间和 O(n)内存到n
void print_primes(int n)
{
int primes[n+1],start=2,i;
/* Initialization , if primes[i]=1 it means
i is prime and if 0 it means i is composite,
initially assume all are prime */
for(int i=1;i<=n;i++)primes[i]=1;
/*Seives method*/
while(start*start<=n)
{
for(i=start*start;i<=n;i=i+=start)
primes[i]=0;
for(i=start+1;i<=n;i++)
{
if(primes[i])
break;
}
start=i;
}
/*Just printing all primes from 1 to n
if primes[i]=1 it means i is prime
and if 0 it means i is composite*/
for(i=2;i<=n;i++)
{
if(primes[i])
cout<<i<<endl;
}
}
由于alain建议不需要地图,数组/矢量会很好。你也可以在这里使用上面的函数检查从1到1000000的所有素数:http://coliru.stacked-crooked.com/a/b617a4d1f1d16ac5。