我是编程新手。我正在尝试打印第n个素数的程序。代码如下:
##program to print the nth prime number
nreq=input("Enter a number ")
pctr=0 ##counter of the prime numbers
num=2
while pctr!=nreq:
ctr=0 ##counter
i=2
while i<=num:
if num%i==0:
ctr=ctr+1
i=i+1
if ctr==1:
pctr=pctr+1
if pctr==nreq:
break
num=num+1
print 'the {}th prime number is {}'.format(nreq,num)
我在python和C中都尝试了相同的算法。对于较大的数字,与C相比,python中的时间要大得多。为什么会出现这种情况?有人可以解释两者执行的区别吗?
我在C中的代码如下:
#include<stdio.h>
void main()
{
int num=2,nreq,ctr=0,pctr=0,i;
printf("enter the number of prime required");
scanf("%d",&nreq);
while(pctr!=nreq)
{
ctr=0;
for(i=2;i<=num;i++)
if(num%i==0)
ctr++;
if(ctr==1)
pctr++;
if(pctr==nreq)
break;
num++;
}
printf("the %dth prime number is %d",nreq,num);
}
答案 0 :(得分:1)
C is often faster than Python因为它被编译,并且不那么抽象。这意味着C生成机器代码,然后由计算机执行。另一方面,Python的解释器实际上是一个C程序,它在运行时通过语法树并执行它,在许多情况下它更慢。如果您希望Python代码运行得更快,那么您可以尝试另一个Python implementation。
话虽这么说,你的算法效率很低,O(n^2)
(虽然我不确定这个问题是否有任何不太复杂的算法)。换句话说,随着输入变大,最坏情况下的复杂度变得更快。有关复杂性的更多信息,请参阅here。
修改:感谢@laindir提供有关如何使此代码不那么复杂的说明:
一个简单的优化是存储到目前为止发现的素数,以便只在内循环中检查它们。这使得它从O(n ^ 2)下降到O(n * p),其中p是小于n的素数。接下来最简单的是在外循环中做一些事情来跳过保证不是素数的数字 - 一种被称为筛选的技术 - 例如,跳过偶数。一个非常简单的筛子是Eratosthenes - 这是unix实用程序素数所使用的筛子。