用Python研究质数分布情况
质数又称素数,是指一个大于1的自然数,除了1和它本身没有任何因数的数。那么如何用Python算出一个范围内质数的数量及同这个范围内所有自然数之比呢?我在这里以50000为例。
首先,我们得做一个“质数判断器”。质数就是除了1和它本身没有任何因数的数。因为一个数的因数一定小于或等于这个数,所以我们只要把1到这个数之间的所有数挨个儿用这个数除一遍,看看有没有能整除的,如果有,那么这个数就是合数;如果没有,那么这个数就是质数。函数示例如下:
def prime_judgementer(number): for i in range(1,number+1): if number%i == 0 and i != number: #条件:如果这个数除以一个小于或等于它的数,余数是0,而且这两个数不相等 return False #那么这个数就是合数 return True #如果把1到这个数之间的所有数挨个儿用这个数除了一遍,还是没有能整除的,那么这个数就是质数
接着,我们用for循环把1到50000以内的所有自然数都用质数判断器判断一次,如果是质数就存在列表里。代码如下:
li = [] t1 = 50000 for j in range(2,t1): if prime_judgementer(j): li.append(j)
然后,我们要每判断10000个数就报告一次,因为等到算到上十万的数时,电脑可能需要时间,你要实时查看电脑算到哪儿了。代码如下:
li = [] t1 = 50000 t2 = 1 for j in range(2,t1): if j%10000 == 0: print("have arrived"+str(t2*10000)) t2 += 1 if prime_judgementer(j): li.append(j)
最后我们算出结果,并把结果保留一位小数。当然,如果只有一位小数,就不用做这件事了。代码如下:
percentage = round(len(li)/t1*100,1) print(str(percentage)+"%")
完整代码如下:
def prime_judgementer(number): for i in range(2,number+1): if number%i == 0 and i != number: return False return True li = [] t1 = int(input()) t2 = 1 for j in range(2,t1): if j%10000 == 0: print("have arrived"+str(t2*10000)) t2 += 1 if prime_judgementer(j): li.append(j) print(len(li)) percentage = round(len(li)/t1*100,1) print(str(percentage)+"%")
结果如下:
- 100以内:25%
- 200以内:23%
- 300以内:20.7%
- 400以内:19.5%
- 500以内:19%
- 750以内:17.6%
- 1000以内:16.8%
- 1500以内:15.9%
- 2000以内:15.2%
- 3500以内:14.0%
- 5000以内:13.4%
- 1万以内:12.3%
- 1.5万以内:11.7%
- 2万以内:11.3%
- 5万以内:10.3%
- 10万以内:9.6%
- 20万以内:9%
- 35万以内:8.6%
- 50万以内:8.3%
- 75万以内:8%
- 100万以内:7.8%
- 150万以内:7.6%
- 200万以内:7.4%
- 300万以内:7.2%
- 350万以内:7.1%
最后,如果我的代码有错误,请在评论区告诉我。我还是一个小学生,代码难免有误,请大家多多指正!
浙公网安备 33010602011771号