//find primes [0,n], and output to primes[]
unsigned int findPrime(const unsigned int n, unsigned int * primes)
{
if(n < 2)
return 0;
long long i,j,k;
bool * isPrimes = 0;
isPrimes = malloc((n+1)*sizeof(bool));
if (isPrimes == 0)
return -1;
memset(isPrimes, 0, sizeof(bool) * (n+1));
for (i=2,j=0; i<=n; i++)
{
if (isPrimes[j] == 0) // is primes
{
//所有素数的倍数都不是素数
primes[j++] = i;
for(k = 2; i*k <= n; k++)
isPrime[i*k] = 1;//is not primes
}
}
return j;//返回素数的个数
}
//生成[m,n]之间的素数,写进文件
unsigned int GeneratePrime(unsigned int m, unsigned int n)
{
if(n<2 || m>n)
return 0;
unsigned int primeNum = 0;
unsigned int tmp = sqrt(n);
unsigned int *primes = malloc(sizeof(unsigned int) * (tmp+1));
unsigned int k = findPrime(tmp, primes);//生成sqrt(n)以内的素数
char filename[50];
sprintf(filename, "prime%u-%u.txt", m, n);
FILE *fp = fopen(filename, "w");
if(m < 2)
m = 2;
for(long long i = m; i <= n; i++)
{
unsigned int tmp = sqrt(i);
bool flag = true;
for(unsigned int j = 0; primes[j] <= tmp && j < k; j++)
{
if(i % primes[j] == 0)
{
flag = false;
break;
}
}
if(flag)
{
fprintf(fp, "%lld ", i);
primeNum++;
if(primeNum % 1000 == 0)
fprintf(fp, "\n");
}
}
fprintf(fp, "\nprime number:%d", primeNum);
fclose(fp);
free(primes);
return primeNum;//返回素数的个数
}
unsigned int findPrime(const unsigned int n, unsigned int * primes)
{
if(n < 2)
return 0;
long long i,j,k;
bool * isPrimes = 0;
isPrimes = malloc((n+1)*sizeof(bool));
if (isPrimes == 0)
return -1;
memset(isPrimes, 0, sizeof(bool) * (n+1));
for (i=2,j=0; i<=n; i++)
{
if (isPrimes[j] == 0) // is primes
{
//所有素数的倍数都不是素数
primes[j++] = i;
for(k = 2; i*k <= n; k++)
isPrime[i*k] = 1;//is not primes
}
}
return j;//返回素数的个数
}
//生成[m,n]之间的素数,写进文件
unsigned int GeneratePrime(unsigned int m, unsigned int n)
{
if(n<2 || m>n)
return 0;
unsigned int primeNum = 0;
unsigned int tmp = sqrt(n);
unsigned int *primes = malloc(sizeof(unsigned int) * (tmp+1));
unsigned int k = findPrime(tmp, primes);//生成sqrt(n)以内的素数
char filename[50];
sprintf(filename, "prime%u-%u.txt", m, n);
FILE *fp = fopen(filename, "w");
if(m < 2)
m = 2;
for(long long i = m; i <= n; i++)
{
unsigned int tmp = sqrt(i);
bool flag = true;
for(unsigned int j = 0; primes[j] <= tmp && j < k; j++)
{
if(i % primes[j] == 0)
{
flag = false;
break;
}
}
if(flag)
{
fprintf(fp, "%lld ", i);
primeNum++;
if(primeNum % 1000 == 0)
fprintf(fp, "\n");
}
}
fprintf(fp, "\nprime number:%d", primeNum);
fclose(fp);
free(primes);
return primeNum;//返回素数的个数
}