首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

小弟我又来啦~还是纯素数有关问题

2013-07-01 
我又来啦~还是纯素数问题!#includeiostream#includebitset#includecmath#includecstdio#define N

我又来啦~还是纯素数问题!


#include<iostream>
#include<bitset>
#include<cmath>
#include<cstdio>
#define N 100000000
using namespace std;
bitset <N+1> p;
int main()
{
int i,j;
p.set();
p.reset(0),p.reset(1);
for(i=4; i<N; i+=2)
p.reset(i);
for(i=3; i<=10000; i+=2)
if(p.test(i))
for(j=i*i;j<p.size();j+=i*2)
p.reset(j);
for (i=11;i<N;i+=2)//筛纯素数。对于n位数,只验证n-1位数是否为纯素数
{
if (p.test(i)) 
{
if (i%10!=3&&i%10!=7) {p.reset(i);continue;}
int wei=0,m=i;
while(m) m/=10,wei++;
if (!p.test(i%(int)pow(10.0,wei-1))) p.reset(i);
}
}
while(cin>>i)
{
if (i==1) {cout<<"2\n3\n5\n7\n";continue;}
for (j=pow(10.0,i-1)+1;j<pow(10.0,i);j+=2)
if (p.test(j)) printf("%d\n",j);
}
return 0;
}

[解决办法]
试试http://blog.csdn.net/turingo/article/details/8161061这个算法。
[解决办法]
为什么要把pow写到循环里面?
[解决办法]

#include <iostream>
#include <cstring>
#include <ctime>

unsigned char primes[ 100000000 / 8];
int unset_flag( unsigned i )
{
    primes[ i >> 3 ] &= ~ ( 1 << ( i & 0x07) );
}
int get_flag( int i )
{
    return primes[ i >> 3] & ( 1 << ( i & 0x07) );
}
int prepare_primes()
{
    unset_flag(0);
    unset_flag(1);
    for( int i = 2; i < 10000; ++ i)
    {
        if( get_flag(i))
        {
            for( int j = i + i; j < 100000000; j += i)
            {
                unset_flag(j);
            }
        }
    }
}

int test_number( unsigned int value, unsigned int base )
{
    int is_prime = 1;
    do
    {


        is_prime = get_flag( value );
        value %= base;
        base /= 10;
    }while( is_prime && (base > 0));
    return is_prime;
}

void test( int n )
{
   std::clock_t start = std::clock();
   std::memset( primes, 0xFF, sizeof(primes));
   prepare_primes(); 
   int begin = 10,end = 100;
   for( int i = 2; i <= n; ++ i)
   {
        for( int value = begin; value < end; ++ value)
        {
            if( test_number(value, begin))
            {
                std::cout << value << ' ';
            }
        }
        begin = end;
        end *= 10;
   }
   std::cout << "\nTime: " << double(std::clock() - start)/CLOCKS_PER_SEC ;
   
}
int main()
{
    test(8);
    return 0;
}


[解决办法]
Finding prime numbers - Kenneth Haugland
Different schemas for finding prime numbers explained with code
http://www.codeproject.com/Article.aspx?tag=198374988322054872&

热点排行