用c语言求输入区间内的所有素数,为什么内层循环要用j<=sqrt(i)才能成功,用j<=i不可以。


#include<stdio.h>
#include<math.h>
int main()

{
    printf("输入一个范围 (x,y)");
    int x, y;
    
    int num = 0;
    do
    {
        scanf("%d %d", &x, &y);
    } while (x>=y||x<=1||y<=1);
    for (int i=x; i <= y; i++)
    {
        int j;
        int q = 1;
        _**for (j = 2; j <= sqrt(i); j++)_**_
        {
            if (i % j == 0)
            {
                q = 0;
                break;
            }
        }
        if (q == 1)
        {
            printf("%d\t", i);
            num++;
            if (num % 6 == 0)
                printf("\n");
        }
            

        
    }
    printf("\n");
        printf("区间内共有%d个素数", num);

    return 0;

}

这个是能成功的

搞清楚判断素数的逻辑是什么,除了1和本身不能被别的整数整除,你把终止条件取到i已经破坏了这个逻辑,你最多可以取到i-1,但实际上通过数学知识不难证明取到sqrt(i)就可以了

第19行应该这么改:for (j = 2; j < i; j++)
如果要提高效率,这么改:for (j = 2; j*j <= i; j++)

j<=i ,因为j==i时,i%j==0,那么会判定不是素数
所及如果要用i做判断就 j<i;
调高效率 j<=sqrt(i);