在C中显示2-10000的素数
我正在努力解决教授建议我尝试的这个(可选)问题。基本上,我的任务是编写一个程序,使用我自己的用户定义函数来确定素数,显示2-10000之间的所有素数整数。这听起来很简单,但我在调试我的程序时遇到了很大的困难。由于某些原因,我的代码在结束前只显示2和3在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
#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,但事实似乎并非如此。@murireturn
语句不仅允许您返回某些内容,还可以返回给调用者。我更新了我的答案,以说明如何在不进行额外测试的情况下仅使用一条return语句。
y <= (int)sqrt(x)
y * y <= x