C 求给定值n以下素数的优化方法
我是通过对每个值C 求给定值n以下素数的优化方法,c,algorithm,C,Algorithm,我是通过对每个值k使用此函数从k=3检查到n(给定的上限值)来执行此操作的。我如何优化它以获取数组中的所有素数,直到n,而不需要检查每个数k int primeCheck(long long int k) { int j; int isPrime = 1; int sr = (int)sqrt(k); for (j = 2; j <= sr; j++) { if (k % j == 0) { //printf("===
k
使用此函数从k=3
检查到n
(给定的上限值)来执行此操作的。我如何优化它以获取数组中的所有素数,直到n
,而不需要检查每个数k
int primeCheck(long long int k) {
int j;
int isPrime = 1;
int sr = (int)sqrt(k);
for (j = 2; j <= sr; j++) {
if (k % j == 0) {
//printf("=========== %d|%d\n", num,num2); // uncomment this to see if a number is divisible
isPrime = 0; // this number is not prime, cos num can be divided by num2
break;
}
}
if (isPrime) {
return isPrime; // reset the check parameter
} else {
return 0; // reset the check parameter
}
return 0;
}
int-primeCheck(long-long-int-k){
int j;
int-isPrime=1;
int sr=(int)sqrt(k);
对于(j=2;j你也可以跳过2后面的偶数
int primeCheck(long long int k){
if(k<=1 || k%2==0){ //if number is even return 0 its not prime
return 0;
}
int sr = (int) sqrt(k); //probable divisor
for(int j=3;j<=sr;j+=2){
if(k%j == 0){
//printf("=========== %d|%d\n", num,num2); // uncomment this to see if a number is divisable
return 0; //if number is not prime skip everything and return zero
}
}
return 1; //if loop completes i.e. not divisor found then return return 1
}
int-primeCheck(long-long-int-k){
如果(k如果您想检查范围内的大量数字,我建议使用Eratosthenes算法进行筛选。
您的功能可能会更好一些:
int primeCheck(long long int n)
{
if (n <= 1)
{
return 0;
}
if (n <= 3)
{
return 1;
}
if (n % 2 == 0 || n % 3 == 0)
{
return 0;
}
int sr = (int)sqrt(n);
for (int i = 5; i <= sr; i += 6)
{
if (n % i == 0 || n % (i + 2) == 0)
{
return 0;
}
}
return 1;
}
int-primeCheck(long-long-int-n)
{
如果(n尝试使用Eratosthenes筛选。该算法通过消除从2
到n
的质数的所有因子来工作
int main() {
int n;
scanf("%d", &n);
int prime[n+1];
for(int i = 0; i < n+1; i++)
prime[i] = 0;
for(int i = 2; i <= sqrt(n+1); i++) {
if(prime[i] == 0) {
for(int j = i*i; j <= n; j += i)
prime[j] = 1;
}
}
int prime_list[n], size = 0;
for(int i = 2; i <= n; i++) {
if(prime[i] == 0)
prime_list[size++] = i;
}
}
intmain(){
int n;
scanf(“%d”和“&n”);
整数素数[n+1];
对于(int i=0;i 对于(int i=2;i)来说,一个快速的优化方法是不检查所有偶数。(还有很多。可能从谷歌搜索埃拉托什尼筛开始)从一个只包含[2]的素数数组开始,计数器设置为1。然后,检查从3开始的每个奇数,使用迄今为止找到的素数数组检查新数是否为素数,每次找到新素数时,将其附加到素数数组中,并递增到目前为止找到的素数。prime
不需要如此大的类型,无符号字符代码>就足够了。名称本身令人困惑。使用calloc()
而不是通过VLA分配它的风险较小,VLA将为任何足够大的n
值调用未定义的行为。