Board logo

标题: [原创代码] 欧啦计划第七题10001st prime [打印本页]

作者: codegay    时间: 2016-4-6 07:22     标题: 欧啦计划第七题10001st prime

本帖最后由 codegay 于 2016-4-6 07:25 编辑

欧啦计划第七题10001st prime
  1. #="""
  2. julia解欧啦计划第七题10001st prime
  3. https://projecteuler.net/problem=7
  4. 2016年4月6日 05:59:30 codegay
  5. """=#
  6. result=[]
  7. for r in countfrom(3,2)
  8. if isprime(r)
  9. append!(result,[r])
  10. if length(result)==10000
  11. println(r)
  12. break
  13. end
  14. end
  15. end
  16. #104743
  17. #[Finished in 4.4s]
复制代码
windows 版julia启动速度慢,3.2-4秒左右。拖慢了时间。
如果对julia熟悉的话,应该是可以写成一行。
作者: codegay    时间: 2016-4-6 08:41

欧拉计划 | Project Euler 中文翻译站

http://pe.spiritzhang.com/
作者: codegay    时间: 2016-4-6 08:55

本帖最后由 codegay 于 2016-4-6 09:28 编辑

欧拉计划 | Project Euler 中文翻译站 git

https://github.com/PE-CN/PE-CN.github.io

上面贴的旧站估计是不更新了。新站转到PE-CN.github.io
但是github很多资源被墙,可能也快要打不开了。

图灵的专栏,一年没有解题进度了。http://www.ituring.com.cn/minibook/10665
作者: codegay    时间: 2016-4-6 22:41

纠正一下。实际上我的数学知识都忘记光了。解题的都是要百度数学概念的。算不喜欢以及爱好者。

我最近确实喜欢用程序来解数学题,解题中能把学的东西用上,也能为解决问题去查资料学东西。
作者: happy886rr    时间: 2016-4-6 22:53

回复 4# codegay
julia在数值计算,绘图方面的优势很大,只是安装包体积太大。希望日后能出精简版。
作者: codegay    时间: 2016-4-6 23:29

回复 5# happy886rr


julia使用git作为库的更新源。里面带了一套git程序,好像还有一套编译器。安装体积加倍了。
这些是构成能让julia正常工作的一部分,至少短期内官方不会分出精力来搞精简版。

安装包不过几十M。OFFICE也至少几百M。这个问题对我来说没有心理障碍。

julia windows版在SSD硬盘的情况下启动至少需要3秒,这个才是我没法忍的。
作者: codegay    时间: 2016-4-7 00:29

本帖最后由 codegay 于 2016-4-7 04:39 编辑
  1. #="""
  2. #方法二
  3. julia解欧啦计划第七题10001st prime
  4. https://projecteuler.net/problem=7
  5. 2016年4月7日 00:23:25 codegay
  6. """=#
  7. #julia primes([start,]end)函数,默认会生成小于等于end的素数数组
  8. #-_-只要end够大一定能包含第10001个素数...但是end太大的话会把内存吃光。
  9. counter=0
  10. for r in primes(99999999)
  11. counter+=1
  12. if counter==10001
  13. println(r)
  14. break
  15. end
  16. end
  17. #104743
  18. #[Finished in 3.9s]
  19. #primes(99999999)[10001] 可以这样一行流
  20. println(@time primes(99999999)[10001])
复制代码

作者: codegay    时间: 2016-4-7 15:37

julia 一行流
  1. collect(take(filter(isprime,countfrom(3,2)),10000))[end]
复制代码

作者: happy886rr    时间: 2016-4-7 19:47

本帖最后由 happy886rr 于 2016-4-8 15:25 编辑

回复 8# codegay
  1. /*
  2. TinyC script混编
  3. move %0 "%~0.c"&cls&@tcc\tcc.exe -run "%~0.c"&rename "%~0.c" "%~nx0"
  4. */
  5. #include<stdio.h>
  6. main()
  7. {
  8. int i,j,sum=0;
  9. for(i=1;i<=2000000000;i+=2){
  10. for(j=3;j*j<=i;j+=2){
  11. if(i%j==0) break;
  12. }
  13.     if(j*j>i) sum++;
  14. if(sum==10001) break;
  15. }
  16. printf("Problem7 -Project Euler\n");
  17. printf(" * The 10001st prime number is “%d”\n",i);
  18. getchar();
  19. }
复制代码

作者: codegay    时间: 2016-4-7 22:47

本帖最后由 codegay 于 2016-4-7 22:54 编辑

回复 9# happy886rr


    我操太好用了!
只是我这里编译后运行,乱码
  1. Problem7 -Project Euler
  2. * The 10001st prime number is 鈥?04743鈥?
复制代码
你那里正常?
win 7x64
作者: happy886rr    时间: 2016-4-7 22:56

回复 10# codegay
而且批处理代码和C代码融合的很好,相互可以调用和传递参数,基于的第三方C解释器tcc精简版才100多kb,运行非常迅捷。
作者: codegay    时间: 2016-4-7 22:58

回复 11# happy886rr


    我知道啊。
但是本质也是需要编译过的。
TCC就是编译器嘛。
作者: codegay    时间: 2016-4-7 23:01

乱码问题解决了。存为ANSI编码了。
作者: happy886rr    时间: 2016-4-7 23:04

回复 13# codegay
tcc有个-run参数。我利用这个参数直接当脚本运行。也没发现tcc产生临时文件。tcc的官网也说它直接就支持不编译而运行,估计是读到内存里了。
作者: codegay    时间: 2016-4-7 23:10

我还得跟你解释
我会gt tcc 。。一行命令把tcc下载下来
会存为xx.bat运行。。。
作者: happy886rr    时间: 2016-4-7 23:19

回复 16# codegay
julia的计算能力更卓越,但不知为何你启动就要3秒,有那么费时吗。SSD 4k读写几十M应该是秒开的。
作者: codegay    时间: 2016-4-7 23:22

回复 16# happy886rr

windows版的问题。
linux版启动0.2秒
作者: happy886rr    时间: 2016-4-7 23:31

回复 17# codegay
另外你的解法是生成小于等于end的素数数组,但是你没有对end进行估值。
可以用素数定理逆推出end大体范围,从而减少不必要的素数生成。因为计算上亿级别的素数根本不是几秒的事。但如果用递增,就不用考虑这些。
作者: codegay    时间: 2016-4-7 23:38

回复 18# happy886rr


    好的。但是我并不懂算法。
julia现在的primes() 函数还不是生成器,直接返回一个数组。所以会有大量内存消耗的问题。
作者: happy886rr    时间: 2016-4-10 23:36

本帖最后由 happy886rr 于 2016-4-11 09:34 编辑

三种不同算法,最后一个基于最好的数学理论.
  1. #  Python解EulerPJ-7P:The 10001st prime number is?
  2. # 常规解法用小于根号N的奇数去除
  3. N=1;i=1;
  4. while i<10001:
  5. N+=2;v=1
  6. for j in range(3,int(N**0.5)+1,2):
  7. if N%j is 0:
  8. v=0;
  9. if v is 1:
  10. i+=1
  11. print(N)
复制代码
  1. # Python解EulerPJ-7P:The 10001st prime number is?
  2. # 构建素数数组p,只用素数数组中的数去除,按理说速度会提高,自己语法不太会,速度没提高很囧。
  3. N=1;i=1;p=[]
  4. p.append(3)
  5. while i<10001:
  6. N+=2;v=1
  7. for j in range(1,len(p)):
  8. if N%p[j] is 0:
  9. v=0
  10. if p[j]**2>N:
  11. break
  12. if v is 1:
  13. i+=1;p.append(N)
  14. print(N)
复制代码
  1. # Python解EulerPJ-7P:The 10001st prime number is?
  2. # 构建小于1000/3的素数数组p,只用小于333.3...的素数去除,理论上讲是最优解法,但是python数组效率没救了,居然用了0.7秒才出结果。脑汁已用尽!
  3. N=1;i=1;p=[]
  4. p.append(3)
  5. while i<10001:
  6. N+=2;v=1
  7. for j in range(1,len(p)):
  8. if N%p[j] is 0:
  9. v=0
  10. if v is 1:
  11. i+=1
  12. if N<333:
  13. p.append(N)
  14. print(N)
复制代码

作者: codegay    时间: 2016-4-11 02:52

25th是什么鬼。

当年我入门python可是用了半个月。。。

数组长了,操作会变很慢的。
作者: happy886rr    时间: 2016-4-11 09:36

回复 21# codegay
欧拉项目题多,搞错题号,代码已修改,又增加一个最优算法,见原楼。
作者: codegay    时间: 2016-4-11 16:17

回复 22# happy886rr


    python很多对象都是可迭代的。不用len range index
for r in list\str\文件IO 都可以。

网上说的字典和集合都是hash表存储的。缺点是默认不保持顺序。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2