,哥德巴赫猜想” (10 分) 著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。
问下这个判断素数是怎么判断的?n*n什么意思?为什么n+=2?
def isprime(x):
if x==2: return True
if x%2==0: return False
n=3
while n*n<=x:
if x%n==0: return False
n+=2
return True
```
【有帮助请采纳】
判断数字x是否为素数:主要思路是排除合数,剩下的就是素数
定义函数isprime
如果x等于2,则它是素数
按程序执行的顺序,如果在判断是否为2时没有返回True,则说明x不是2,那么判断x是否为偶数,如果是就返回Flase,因为偶数中只有2是素数
定义n从3开始(定义为1没有意义,任何数对1取余运算都是0)
每次n加2,因为值判断奇数,(不用设置n为偶数,因为此时的x是奇数,而奇数对偶数取余不会等于0)
如果取余运算等于0,显然x就是合数,返回Flase
至于为什么是n*n:
因为一个合数的约数都是成对出现的,不难理解,一个合数的任意一对约数,只会出现两种情况(这是个数学问题)
第一,这对约数相等
第二,这对约数中一个大于该合数的算术平方根,还有一个小于该合数的算术平方根
所以,为了加快程序的运行速度,我们遍历数字x可能的约数,从3开始,遍历到该数的平方根就行了
又因为,约数必定是整数,所以在大于n的平方而不大于(n+1)的平方根之间的数字x的算术平方根必定在n与n+1之间,所以这里是 n*n<x
最后,排除了一个素数2和全部的合数之后,剩下的就是素数了,返回True
【有帮助请采纳】
语言还挺难描述的,可以去看一下这里
https://www.zhihu.com/question/21808179
至于n += 2是因为保证n是奇数,如果n是偶数没有判断的必要,因为一开始已经判断了x % 2 == 0,如果能走到while循环里,说明x不是偶数,x对偶数取余也就不可能等于0
def isprime(x):
if x==2: return True
if x%2==0: return False
n=3
while n*n<=x:
if x%n==0: return False
n+=2
return True
1、因为走过前面2个判断后就可以知道x是大于或等于3的数,n*n是因为判断到x的前一半就知道了,如果前半没有可以整除的数,那后半也就没有整除的数了,这样是为了减少时间复杂度,因为当年度x很大的时候,会需要循环很多次
2、n+=2是因为合数和素数取余的话不可能是0,走完循环的话就说明这个数是素数
3、其实你也可以采用牺牲内存来换取时间的方法http://www.primos.mat.br/2T_en.html
这个网址里面有很多很多的素数,够你测试了,接下来就是打开这个网址的txt文本来遍历,比较快,这样,不用运算操作,有用的话点一下采纳
第一, 弄清楚素数的条件, 只有1和其本身两个因数的数叫做素数。 那么如何去判断呢? 当然是看从2 到 n中有没有x的因素, 如果有,则不是素数,反之则是!
第二, n到哪里就可以了呢?取x = 10, 我们要去试 2, 3, 有没有必要去试一试5呢?没有必要, 因为 2 * 5 = 10 和 5 * 2 = 10是相同的情况
第三, 当x是偶数时, x % 2 == 0已经返回, 如果n为偶数且x % n == 0, 那么x一定为偶数, 所以我们根本不用考虑n为偶数的情况, 所以 + 2跳过偶数
有用请采纳