判断素数个数 为啥错 #c语言#

img

img


为啥运行超时呀我感觉代码都是正确的呀,这节是循环,用循环的方法解题,为啥显示运行超时呀

for(t=2;t<=sqrt(i);t++)
你用t<i-1的话,无效的循环太多了
比如判断100是否为素数的话,实际你判断从2到10就可以了,但你从2判断到99

让n自增到sqrt(n)就行

用筛选法:

#include<stdio.h>
int num[1000002] = { 1,1,0 };
void Init()
{
    int i, j;
    for (i = 2; i <= 500000; i++) {
        if (num[i] == 0) {
            for (j = i + i; j <= 1000000; j += i) {
                num[j] = 1;
            }
        }
    }
}
int sum(int a,int b)
{
    int i, sum;
    for (i = a, sum = 0; i <= b; i++) {
        if (num[i] == 0) {
            sum++;
        }
    }
    return sum;
}
int main() {

    int n;
    Init();
    scanf("%d", &n);
    if (n == 1)
        printf("0\n");
    else
        printf("%d\n", sum(1,n));
    return 0;
}

看看我这个看合适不? 仅供参考!谢谢!

img

img

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void isprime(int n)
{

    if (n < 2)
    {
        printf("不存在\n");
        return;
    }
    else if (n == 2)
    {
        printf("2\n");
        return;
    }

    printf("2\n");
    int m = n / 2;

    int *p = malloc(m * sizeof(int));
    int *p0 = p, *p1 = p, *p2 = p;
    if (!p)
        return;

    int i = 3;
    int total = 0;
    for (; i <= n; i += 2)
    {
        *p++ = i;
        total++;
    }
    // 有效位置末尾用1标记
    *p = 1;
    total--;
    i = 1;

    // 不是素数的位置赋值为4
    while (*p1 != 1)
    {
        if ((p1 - p2 + (i * (*p1))) <= total)
        {
            *(p1 + (i * (*p1))) = 4;

            i++;
        }
        else
        {
            p1++;
            while (*p1 == 4)
            {
                p1++;
            }
            i = 1;
        }
    }

    while (*p0 != 1)
    {
        if (*p0 != 4)
        {
            printf("%d\n", *p0);
        }
        p0++;
    }
    
    free(p2);
}

int main()
{
    int n;
    scanf("%d", &n);
    isprime(n);
    return 0;
}
#include<stdio.h>
int prime(int x)
{
    for(int j=2;j<=x/j;j++)
    {
        if(x%j==0)
        {
            return 0;
        }
    }
    return 1;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=2;i<=n;i++)
    {
        if(prime(i))
        {
            printf("%d ",i);
        }
    }
    return 0;
}