在C中显示2-10000的素数

在C中显示2-10000的素数,c,primes,C,Primes,我正在努力解决教授建议我尝试的这个(可选)问题。基本上,我的任务是编写一个程序,使用我自己的用户定义函数来确定素数,显示2-10000之间的所有素数整数。这听起来很简单,但我在调试我的程序时遇到了很大的困难。由于某些原因,我的代码在结束前只显示2和3 #include<stdio.h> //function declaration int prime(int); //main body int main(void) { int x=2, y; for (x=2;x&l

我正在努力解决教授建议我尝试的这个(可选)问题。基本上,我的任务是编写一个程序,使用我自己的用户定义函数来确定素数,显示2-10000之间的所有素数整数。这听起来很简单,但我在调试我的程序时遇到了很大的困难。由于某些原因,我的代码在结束前只显示2和3

#include<stdio.h>
//function declaration
int prime(int);
//main body
int main(void)
{
    int x=2, y;
    for (x=2;x<=30;x++)
    {
        y=prime(x);
        if (y!=0)
            printf("%d\n", x);
    }
    getchar();
    return(0);
}
//function definition
int prime(int x)
{
    int y;
    for (y=2; y<=(int)sqrt(x); ++y)
    {
        if (x%y==0)
           return 0;
    }
    if (y==(int)sqrt(x))
       return 1;
}
我看到了所有非素数的列表。如果我运行以下操作:

printf("%d    %d\n", x, y);
我看到一个2-10000之间所有整数的列表,以及素数检查函数的结果(0表示非素数,2686xxx表示素数)

为什么相反的(y!=0)不显示素数列表?是什么导致我的代码在显示2和3后停止?为什么我的素数函数返回的是一个奇怪的整数而不是1?最后,我还是一个初学者,但是我怎样才能编写出更好的代码呢?我不认为我违反了任何公认的标准实践,但我如何才能使我的代码更干净、更高效呢


提前感谢您的帮助

在素数函数的末尾,只需返回1。如果它不是prime,那么它早就返回了0。对吧?

因为它是你做了一个函数,有时什么也不返回。这意味着它返回寄存器中的任意随机值。

如果
y==(int)sqrt(x)
,循环将继续。所以当它结束时,它们是不平等的。你想要的是:

if (y>=(int)sqrt(x))
   return 1;
但这根本不需要。只需
返回1已足够。如果数字不是素数,则已返回零

如果只需要一条返回语句:

int prime(int x)
{
    bool isPrime = true;
    int y;
    for (y=2; y<=(int)sqrt(x); ++y)
    {
        if (x%y==0)
        {
            isPrime = false;
            break;
        }
    }
    return isPrime;
}
intprime(intx)
{
bool isPrime=true;
int-y;
对于(y=2;y不要使用sqrt()函数。在数学中,如果你有“x=sqrt(y)”。如果你两边都平方,你会得到类似“x*x=y”的结果。c中的这个表达式比sqrt函数快得多。因此,不要这样做:

y <= (int)sqrt(x)

y您可以使用eratosthenes筛子或atkin筛子标记数组中的所有素数,然后显示素数。虽然它会带来一些空间复杂性,但它会节省时间

e、 如果你想显示从1到10的素数

它不是素数,它既不是素数也不是复合数

所以从2开始

考虑这个大小为10=2 3 4 5 6 7 8 9 10的数组

从2开始遍历。如果元素未高亮显示,则高亮显示其所有倍数

i、 e代表2突出显示其倍数4 6 8 10

==>2345678910

对于3个人,也要这样做

==>2345678 9 10

然后对第5和第10号的其余部分执行此操作(此处7没有多个)

最后打印非高亮显示的元素。2,3,5,7


对任何其他范围重复此过程。

既然您对编写素数的计算机程序感兴趣,也许您想将本文变成一个计算机程序。它处理素数,类似于您试图在C中创建的筛子


我不确定它是更快还是更少的内存密集型,但我很好奇,在质数变得对计算机来说太密集之前,它能找到多高的质数。

如果
x
为3,请在心里了解你的
prime
函数的作用。你应该能够明白为什么它返回一个无意义的值。(提示:2大于
(int)sqrt(3)
对吗?)确保一个函数的所有路径都有一个返回语句。你的<代码> Prime函数没有。相关:考虑建立一个A,并在完成时取出所有的素数。你需要一个标志数组,一个嵌套循环,和一些简单的数学。查看关于该算法的细节的链接文章。谢谢帮助。让我快速检查一下。我理解我的错误。完成循环后,y==(int)sqrt(x)+1所以我最初编写的不会返回任何内容。但编写if语句完全没有必要,因为所有非素数都会返回0。函数在返回正确的内容后会中断?我原本担心删除if条件会使每个整数返回1,但事实似乎并非如此。@muri
return
语句不仅允许您返回某些内容,还可以返回给调用者。我更新了我的答案,以说明如何在不进行额外测试的情况下仅使用一条return语句。
y <= (int)sqrt(x)
y * y <= x