C语言中的素数优化

C语言中的素数优化,c,primes,C,Primes,我试着打印素数;200万到100万。但控制台上没有打印任何内容。你能查一下我的密码吗?我怎样才能使这段代码更优化 这是我的密码: #include <stdio.h> #include <math.h> main() { int num, sr, num2; for (num = 2; num <= 1000000; num++) { sr = (int) sqrt(num); for (num2 = 2; sr % num2

我试着打印素数;200万到100万。但控制台上没有打印任何内容。你能查一下我的密码吗?我怎样才能使这段代码更优化

这是我的密码:

#include <stdio.h>
#include <math.h>

main()
{
   int num, sr, num2;

   for (num = 2; num <= 1000000; num++) {
      sr = (int) sqrt(num);
      for (num2 = 2; sr % num2 != 0; num2++) {
         if (sr == num2) {
            printf("%d\n", sr);
         }
      }
   }

}
#包括
#包括
main()
{
int num,sr,num2;
对于(num=2;num它编译了吗

第4行:
main()

另一件事:sr=1。1模任何数都是1

最后,sr永远不会等于num2,因为sr是1,num2是2或更大,所以它永远不会打印任何东西

这将使您进入一个不包含任何内容的无限循环
    #include <stdio.h>
    #include <math.h>

    int main(){
    int num, sr, num2;
    int isPrime = 1; // this is a check parameter; isPrime = 0 if number is not prime.
    for(num=2; num<=100; num++){
        sr = (int) sqrt(num);
        for(num2=2; num2 <= sr; num2++){
            //num2 <== sr to stop the innner loop
            if(num%num2 == 0){
                //printf("=========== %d|%d\n", num,num2); // uncomment this to see if a number is divisable
                isPrime = 0; // this number is not prime, cos num can be divided by num2
                break;
            }
        }
        if(isPrime){
            printf("Prime number is %d\n", num);
            isPrime = 1; // reset the check parameter
        }else{
            isPrime = 1; // reset the check parameter
        }
    }
         return 0;
    }
#包括 int main(){ int num,sr,num2; int isPrime=1;//这是一个检查参数;如果数字不是素数,isPrime=0。
对于(num=2;num,如果您希望对其进行优化,则应使用类似于eratosthenes筛的工具。在您的数据范围内操作很容易。您可以在此处阅读更多信息:
您可以使用的一个优化是3以上的所有素数都是6n+1或6n-1的形式,并且如果一个数字可以被素数整除,它就不是素数。下面是一些使用该事实的代码:

#include <stdio.h>
#include <math.h>

int is_prime(long num)
{
    int k = 1, a = 0, b = 0;
    long sr;
    switch(num)
        {
        case 1: return 0;
        case 2: return 1;
        case 3: return 1;
        case 4: return 0;
        case 5: return 1;
        case 6: return 0;
        case 7: return 1;
    }
    if (num % 2 == 0) return 0;
    if (num % 3 == 0) return 0;
    sr = (int) sqrt(num);
    while (b < sr) {
        a = (6 * k) - 1;
        b = (6 * k) + 1;
        if (num % a == 0)
            return 0;
        if (num % b == 0)
            return 0;
        k += 1;
    }
    return 1;
}

void main(void)
{
    int j;

    for (j = 0; j<100; j++){
        if (is_prime(j))
            printf("%d is a prime\n", j);
    }
}
#包括
#包括
int是_素数(long num)
{
int k=1,a=0,b=0;
长sr;
开关(num)
{
案例1:返回0;
案例2:返回1;
案例3:返回1;
案例4:返回0;
案例5:返回1;
案例6:返回0;
案例7:返回1;
}
如果(num%2==0)返回0;
如果(num%3==0)返回0;
sr=(int)sqrt(num);
while(b对于(j=0;js)在调试器中遍历代码,错误应该立即显现出来。提示:如果
sr==1
num2>=2
,那么
sr%num2
将是什么?您可以通过注意所有超过3的素数都是6k+1或6k-1的形式来优化它。