梦想绘制者
发表于 2016-11-12 15:42:57
def isPrime(n):
if n <= 1:
return False
else:
half = int(n ** 0.5)
for i in range(2,half + 1):
if n % i == 0:
return False
return True
def SumOfPrimesBelow(n):
SumPrm = 0
for i in range(2, n):
if isPrime(i):
SumPrm += i
return SumPrm
n = int(2E6)
Sum = SumOfPrimesBelow(n)
print('小于%d的质数的和为%d'%(n, Sum))
>>>
小于2000000的质数的和为142913828922
梦想绘制者
发表于 2016-11-12 16:06:32
jerryxjr1220 发表于 2016-10-10 19:23
最快的求质数的方法:
142913828922
果然好快啊!能解释一下的话就更完美了。
梦想绘制者
发表于 2016-11-12 16:08:05
jerryxjr1220 发表于 2016-10-10 19:23
最快的求质数的方法:
142913828922
果然好快啊!能解释一下的话就更完美了。
jerryxjr1220
发表于 2016-11-12 16:58:31
梦想绘制者 发表于 2016-11-12 16:08
果然好快啊!能解释一下的话就更完美了。
用的是标记法,先建一个列表,列表的项数等于要求的最大质数,内容都为True。
然后第0,1项设为False,因为0和1都不是质数。
从第2项开始,是2的倍数的项都是设为假,因为都不是质数。然后只要是列表内还没有设为假的数,从它开始,它的倍数都设为假,直到列表内全部为真的数,那就是质数。
原理就是这样。
利用列表的项数和列表值的对应关系。这样可以减少判断次数,当然速度就是最快的了。
梦想绘制者
发表于 2016-11-16 08:54:10
谢谢,这是以空间换时间的好方法啊,可以进一步优化的,先判断奇偶性,偶数不存储只判断奇数。哈哈,网上看了一下。
lyciam
发表于 2016-11-18 10:39:51
import math
import time
t=time.clock()
def isprime(n):
if (n%2 == 0 and n!=2) or n == 1: return False
for x in range(3,int(math.sqrt(n))+1,2):
if n%x==0: return False
else: return True
def euler10(count=2000000):
result = []
for n in range(count):
if isprime(n): result.append(n)
return sum(result)
print (euler10(),'--time: ',time.clock()-t)
142913828922 --time:9.045785321932144
jerryxjr1220
发表于 2016-11-19 07:47:02
梦想绘制者 发表于 2016-11-16 08:54
谢谢,这是以空间换时间的好方法啊,可以进一步优化的,先判断奇偶性,偶数不存储只判断奇数。哈哈,网上看 ...
一开始也想过,但是我建立列表的时候没有办法只建立奇数列表而没有偶数,如果要每次判断奇偶的话,其实计算时间就不见得比我短了。
梦想绘制者
发表于 2016-11-20 11:04:50
jerryxjr1220 发表于 2016-11-19 07:47
一开始也想过,但是我建立列表的时候没有办法只建立奇数列表而没有偶数,如果要每次判断奇偶的话,其实计 ...
嗯,有可能。这要看追求的是什么了。如果是仅仅速度快的话,你的完全可以。但又要快又要耗得空间少的话,分奇偶还是很可观的,毕竟一下都可以去掉一半的存储空间了。
芒果加黄桃
发表于 2017-1-9 11:28:25
purplenight 发表于 2016-8-7 08:03
# 修改自我的另一份代码, 部分代码或差劲, 能出结果就行.
这是过筛子的方法啊,好快
芒果加黄桃
发表于 2017-1-9 11:31:09
# encoding:utf-8
from math import sqrt
from time import time
def euler010(N=2000000):
l_pn =
result = 0
for n in range(5, N, 2):
# 标志位
ispm = True
sqr_n = int(sqrt(n))
for t in l_pn:
if n % t == 0:
ispm = False
break
if t > sqr_n:
break
if ispm:
l_pn.append(n)
print('小于 %d 的所有质数之和是: %d' % (N, sum(l_pn)))
return result
start = time()
euler010()
print('cost %.3f sec' % (time() - start))
小于 2000000 的所有质数之和是: 142913828922
cost 4.122 sec
渡风
发表于 2017-1-13 16:39:58
此代码使用matlab编程
Problem10所用时间为54.8729秒
Problem10的答案为142913828922
%题目10:计算两百万以下所有质数的和
function Output=Problem10(Input)
tic
if nargin==0
Input=2000000;
end
Sum=2;
Temp=3:Input;
Temp1=4:2:Input;%筛选2的倍数
Temp2=6:3:Input;%筛选3的倍数
Temp3=10:5:Input;%筛选5的倍数
Temp4=14:7:Input;%筛选7的倍数
Temp5=22:11:Input;%筛选11的倍数
New1=setdiff(Temp,Temp1);
New2=setdiff(New1,Temp2);
New3=setdiff(New2,Temp3);
New4=setdiff(New3,Temp4);
New5=setdiff(New4,Temp5);
for ii=New5
if isprime(ii)==1
Sum=ii+Sum;
end
end
Output=Sum;
toc
disp('此代码使用matlab编程')
disp(['Problem10所用时间为',num2str(toc),'秒'])
disp(['Problem10的答案为',num2str(Output)])
end
FlySelf
发表于 2017-2-2 21:35:43
import time
def sum_of_primes(number):
'筛法找出所有质数,并求和'
result = 0
list_primes = * (number + 1)
list_primes = False
list_primes = False
for i in range(2, number):
if list_primes:
for j in range(i ** 2, number, i):
list_primes = False
list_result = []
for k in range(2, number):
if list_primes:
list_result.append(k)
for each in list_result:
result += each
return result
start = time.clock()
print(sum_of_primes(2000000))
end = time.clock()
print('程序执行了%fs。' %(end - start))
执行结果:
142913828922
程序执行了1.113385s。
piperacillin
发表于 2017-2-17 16:41:08
本帖最后由 piperacillin 于 2017-2-17 16:42 编辑
def ifprime(n):
k = 0
if n == 1 or n == 0:
k = 1
elif n % 2 == 0 and n != 2:
k = 1
else:
from math import sqrt
maxi = int(sqrt(n))
for i in range(3,maxi+1,2):
if n % i == 0:
k = 1
break
if k == 0:
return True
if k == 1:
return False
k = 0
for i in range(1,2000001):
if ifprime(i):
k +=i
print(k)
0mrli0
发表于 2017-2-23 15:08:54
效率有点低
/*计算200万以内所有质数的和*/
#include <stdio.h>
#include <math.h>
int IsPrime(int x)
{
int i, flag;
flag = 1;
for (i=2; i<=(int)sqrt(x); i++)
{
if (x%i == 0)
{
flag = 0;
break;
}
}
return flag;
}
int main()
{
int i;
long long sum = 2;
for(i=3; i<=2000000; i+=2)
{
sum = IsPrime(i) ? sum + i : sum;
}
printf("sum = %lld", sum);
return 0;
}
sum = 142913828922
Process returned 0 (0x0) execution time : 11.465 s
99592938
发表于 2017-3-14 18:00:03
import time
start = time.clock()
list_prime=
s=num=5
while num<2000000:
f=1
for i in range(2,int(num**0.5)+1):
if num%i==0:
f=0
if f:
s+=num
num+=2
print(s)
end = time.clock()
print("read:%f s" %(end - start))
卧槽,跑下来都4分多钟了
答案:>>>
142913828922
read:255.466301 s
JonTargaryen
发表于 2017-3-30 14:30:06
本帖最后由 JonTargaryen 于 2017-3-30 14:51 编辑
秒出 142913828922
参考:http://blog.csdn.net/liukehua123/article/details/5482854
#include <stdio.h>
#include <math.h>
#define MAX 2000000
int is_prime(long num);
int main(void)
{
_Bool prime = {0};
long i = 3, j;
long sum = 2;
prime = 1;
for(i = 3; i <= MAX; i += 2)
{
prime = 1;
}
for(i = 3; i < sqrt(MAX); i += 2)
{
if(prime)
{
for(j = i + i; j <= MAX; j += i)
{
prime = 0;
}
}
}
for(i = 3; i <= MAX; i += 2)
{
if(prime)
{
sum += i;
}
}
printf("The sum of all the primes within 2,000,000 is: %ld\n", sum);
return 0;
}
}
JonTargaryen
发表于 2017-3-30 15:06:46
本帖最后由 JonTargaryen 于 2017-3-30 15:11 编辑
JonTargaryen 发表于 2017-3-30 14:30
秒出 142913828922
参考:http://blog.csdn.net/liukehua123/article/details/5482854
python 慢一点 0.41595s
import math
MAX = 2000000
def main():
global MAX
prime =
prime = prime * (MAX + 1)
num = 3
result = 2
prime = 1
for num in range(3, MAX + 1, 2):
prime = 1;
for num in range(3, int(math.sqrt(MAX) + 1), 2):
if prime:
for j in range(num + num, MAX + 1, num):
prime = 0
for num in range(3, MAX + 1, 2):
if prime:
result += num
print(result)
if __name__ == "__main__":
main()
Eagle.Tong
发表于 2017-4-29 14:46:32
#求2百万一下所有质数的和
import math
import time
start = time.time()
def ifprime(n):
r = int(math.sqrt(n))
for i in range(2,r+1):
if n%i == 0:
return 0
return 1
sum = 2
n = 3
while n < 2000000:
if ifprime(n):
sum += n
n += 2
print(sum)
end = time.time()
print(end-start)
结果:142913828922
时间:33.8529691696167
天之南
发表于 2017-5-1 00:46:51
本帖最后由 天之南 于 2017-5-1 01:18 编辑
##include<stdio.h>
int main()
{
const int L = 200000;
long long result = 5;
int arr = { 2,3 };
int i = 2;
for (int x = 5;i < L&&x < 2000000;x += 2)
{
int j;
for (j = 0;arr* arr <= x;j++)
{
if (x % arr == 0)
{
j = 0;
break;
}
}
if (j)
{
arr = x;
result += x;
i++;
}
}
system("pause");
return 0;
}
天之南
发表于 2017-5-1 01:14:04
#include<stdio.h>
int main()
{
const int L = 200000;
long long result = 5;
int arr = { 2,3 };
int i = 2;
for (int x = 5;i < L&&x < 2000000;x += 2)
{
int j;
for (j = 0;arr* arr <= x;j++)
{
if (x % arr == 0) {
j = 0;
break;
}
}
if (j) {
arr = x;
result += x;
i++;
}
}
printf("%lld\n", result);
return 0;
}