楼主: chaochao

[胡扯] 蛋疼数学程序帝!质数算法。

 火   [复制链接]
梦石
0
星屑
50
在线时间
0 小时
注册时间
2010-6-27
回帖
20
发表于 2010-6-27 18:26:43 | 显示全部楼层
回复 模仿者 的帖子


    和睡莲一起玩 等她长大了就不能和她一起玩了 长大了就带刺了

点评

你压在她身上,这样她就没办法长大了。  发表于 2010-6-28 04:56
回复

使用道具 举报

标题党66RPG支部书记
职务:66RPG灌水局局长<

梦石
0
星屑
79
在线时间
624 小时
注册时间
2006-2-25
回帖
2383

开拓者冬季迷宫创意大赛亚军第4届短篇游戏比赛冠军

发表于 2010-6-27 22:38:03 | 显示全部楼层
26的开始走题……

对我而言,简直就是在看一群神在写天书
回复

使用道具 举报

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
回帖
1912
发表于 2010-6-28 02:43:12 | 显示全部楼层
回复


    java的  貌似java的效率本身就比C要低些
模仿者 发表于 2010-6-27 18:06


chaochao 的代码是 C#,Java 没有 ulong 这种无符号类型,也没有 List<?>
其实看到 System.Console 就基本上就可以肯定是 C# 了……

chaochao 那个是用可能的质因数试除来判断素性,那内层循环里可以加一个 num <= sqrt(i)

说到平方根,发现我之前写的也没考虑平方根方面的优化,特此补上:

  1. BOUND = 1000000
  2. primes = new bits[BOUND+1]
  3. memset(primes, 1)
  4. for i from 2 to BOUND
  5.     if primes[i] then
  6.         println(i)                // 输出质数
  7.         j = i * i
  8.         while j <= BOUND
  9.             primes[j] = 0
  10.             j += i
  11.         end while
  12.     end if
  13. end for
复制代码
之前写的 j 是从 i << 1 开始,但 i 的小于 i^2 的倍数肯定是已经被之前的质数筛掉了的,所以应该从 i^2 开始
在我的机器上用 VC++ 编译器编译的程序测试,100万以内瞬间算完,1000万低于1秒
如果没弄错的话,埃拉托斯特尼筛法需要 O(n log log n) 时间

评分

参与人数 1星屑 +200 收起 理由
chaochao + 200 好厉害。

查看全部评分

回复

使用道具 举报

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
回帖
6005

烫烫烫开拓者

发表于 2010-6-28 08:37:36 | 显示全部楼层
筛子大发
设数组A={true,false,...,false}(1~n)
找到质数A中第一个false的位置(k)
则输出,标记为true,然后把i*k (i*k<=n)全部置true
重复直到数组A为空

点评

最快的是打表大法O(1)  发表于 2010-6-28 08:39
哎呀,蛋疼什么的最有爱了
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
50
在线时间
0 小时
注册时间
2010-6-19
回帖
5
发表于 2010-6-28 09:43:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
回帖
6429

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

发表于 2010-6-28 10:24:22 | 显示全部楼层
程序帝来了,传说中的查表法,保证比ls那些速度快-v-|||
  1.                 int temp[] = {
  2.                 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
  3.                 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
  4.                 73, 79, 83, 89, 97, 101, 103, 107, 109, 113,
  5.                 127, 131, 137, 139, 149, 151, 157, 163, 167, 173,
  6.                 179, 181, 191, 193, 197, 199, 211, 223, 227, 229,
  7.                 233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
  8.                 283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
  9.                 353, 359, 367, 373, 379, 383, 389, 397, 401, 409,
  10.                 419, 421, 431, 433, 439, 443, 449, 457, 461, 463,
  11.                 467, 479, 487, 491, 499, 503, 509, 521, 523, 541,
  12.                 547, 557, 563, 569, 571, 577, 587, 593, 599, 601,
  13.                 607, 613, 617, 619, 631, 641, 643, 647, 653, 659,
  14.                 661, 673, 677, 683, 691, 701, 709, 719, 727, 733,
  15.                 739, 743, 751, 757, 761, 769, 773, 787, 797, 809,
  16.                 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
  17.                 877, 881, 883, 887, 907, 911, 919, 929, 937, 941,
  18.                 947, 953, 967, 971, 977, 983, 991, 997,};
  19.                 for (int i=0; i<168; i++)
  20.                 {
  21.                                 std::cout << temp[i] << std::endl;
  22.                 }
复制代码
神隐中,偶尔诈尸
回复

使用道具 举报

梦石
0
星屑
50
在线时间
0 小时
注册时间
2010-6-18
回帖
167
发表于 2010-6-28 10:54:11 | 显示全部楼层
回复 雷欧纳德 的帖子


    请用此方法列出1亿以内的{:nm_6:}
回复

使用道具 举报

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
回帖
6429

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

发表于 2010-6-28 10:55:35 | 显示全部楼层
回复 模仿者 的帖子


我先用ls的方法算出1亿以内的表并生成代码就行了,然后我还是最快的
回复

使用道具 举报

清纯红

梦石
0
星屑
61
在线时间
65 小时
注册时间
2009-7-23
回帖
955

贵宾

发表于 2010-6-28 14:09:51 | 显示全部楼层
其实查表法才是最快的~~~
雷欧纳德 发表于 2010-6-27 17:53



+1
回复

使用道具 举报

泽

梦石
0
星屑
50
在线时间
15 小时
注册时间
2007-2-18
回帖
2414
发表于 2010-6-28 14:22:35 | 显示全部楼层
DES里面要生成的素数都是大于long的,乃们这么闲就去研究32位素数吧= =
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部