质数,除2 除3 除5,又没有快速算法?

asimay 2009-10-16 08:48:06
如题:一个丑数序列,即除2 除3 除5,不能整除,
又没有比下面的code更快的运算? 比如移位什么的。


if( num%2 ==0 || num%3 ==0 || num%5 ==0)


...全文
449 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
brookmill 2009-10-17
  • 打赏
  • 举报
回复
我是来看11楼的
zzyjsjcom 2009-10-17
  • 打赏
  • 举报
回复
--- 呵呵,不好意思 打错了一个字

if( num%0x01 ==0 || num%3 ==0 || num%5 ==0)
这个分支也不是很多呀, 现在的intel的分之预测,应该足以预测出所有的分支 从而避免了预测失败的代价, 当然这是个特例,如果分支多了 就可能有 19 楼说的问题
zzyjsjcom 2009-10-17
  • 打赏
  • 举报
回复
if( num%0x01 ==0 || num%3 ==0 || num%5 ==0)
这个分支也不是很多呀, 现在的intel的分之预测,应该足以预测出所有的分支 从而避免了预测失败的代码, 当然这是个特例,如果分支多了 就可能有 19 楼说的问题
ycwu314 2009-10-17
  • 打赏
  • 举报
回复
应该没有吧 即便是源码不写成位运算的形式 编译时也换转过来的
失落的凡凡 2009-10-17
  • 打赏
  • 举报
回复
11楼神奇!
mLee79 2009-10-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 fuzzy_man 的回复:]
引用 11 楼 mlee79 的回复:
0x1f75d77d&(1 < <i%30)

这样做是可行的 ,但是局限性太大,2*3*5数值比较小,可以穷举各种mod30的各种情况.
从速度上考虑,也并不比
if( num%0x01 ==0 || num%3 ==0 || num%5 ==0)
快的了多少,假设mod运算需要20个cpu时钟周期,位运算和比较运算时间花销都忽略
11楼算法的时间是 20 clk
if( Expressions1|| Expressions2 || Expressions3)
50%的概率Expressions1就能完成(一半数据能被2整除).Expressions2中有1/3的概率能完成,2/3的概率需要进入Expressions3
后面算法的时间是 0*1/2 +20*1/6 +40*2/6 = 16.6 clk
[/Quote]

你计算过分支预测失败的要多几个周期么,没听说过现代的计算机算个除法要20个周期的,你说的是486吧。。。


zhengjiankang 2009-10-17
  • 打赏
  • 举报
回复
15楼的做法着实不错
2和5整除的嘛直接看出来了
3的把各位加起来
要是有7以上的再考虑楼主那样的办法嘛
fuzzy_man 2009-10-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mlee79 的回复:]
0x1f75d77d&(1 < <i%30)
[/Quote]
这样做是可行的 ,但是局限性太大,2*3*5数值比较小,可以穷举各种mod30的各种情况.
从速度上考虑,也并不比
if( num%0x01 ==0 || num%3 ==0 || num%5 ==0)
快的了多少,假设mod运算需要20个cpu时钟周期,位运算和比较运算时间花销都忽略
11楼算法的时间是 20 clk
if( Expressions1|| Expressions2 || Expressions3)
50%的概率Expressions1就能完成(一半数据能被2整除).Expressions2中有1/3的概率能完成,2/3的概率需要进入Expressions3
后面算法的时间是 0*1/2 +20*1/6 +40*2/6 = 16.6 clk
magicpang 2009-10-16
  • 打赏
  • 举报
回复
整除3的数的特点是十进制表示时候所有位加起来的和整除3
5的话,末尾是5,或者0,
7不知道

不过二进制表示的时候就不清楚了
东大坡居士 2009-10-16
  • 打赏
  • 举报
回复
9楼说的好像是叫什么筛选法来着....
whycadi 2009-10-16
  • 打赏
  • 举报
回复
可以把整形除法转化为乘法,再做一次减法就能求余。
比如一个32位无符号整形数要除3,可以乘(2^32/3+?)(忘了是加1还是加2了,应该是1吧,需要64位乘法),再取高32位的值就是结果。
类似的5、7、11之类的数也能找到对应的系数。
对于有硬件除法器的CPU,除非是对于效率极重视,否则没必要这样做。不过很多嵌入式CPU没有硬件除法电路,甚至连硬件乘法器也没有,这样做就很有意义了。
baihacker 2009-10-16
  • 打赏
  • 举报
回复
11楼这个爽...
mLee79 2009-10-16
  • 打赏
  • 举报
回复
0x1f75d77d&(1<<i%30)
shashenyidaoOCEAN 2009-10-16
  • 打赏
  • 举报
回复
我也觉得该用位运算
baihacker 2009-10-16
  • 打赏
  • 举报
回复
可以预先打表,如果要处理的数的范围不大,比如说100万.
bool flag[1000000+1];
那么先把2,3,5的倍数置true.
然后flag[value]就可以了.
asimay 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 whg01 的回复:]
引用 3 楼 forestdb 的回复:
闲得蛋疼,看了下汇编码,就发现num % 2可以用num & 0x01来快一下。

除了这个没别的办法了。
[/Quote]

3,5,7,11之类的呢?
whg01 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 forestdb 的回复:]
闲得蛋疼,看了下汇编码,就发现num % 2可以用num & 0x01来快一下。
[/Quote]
除了这个没别的办法了。
lbh2001 2009-10-16
  • 打赏
  • 举报
回复
取模是个较慢的运算
asimay 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 forestdb 的回复:]
闲得蛋疼,看了下汇编码,就发现num % 2可以用num & 0x01来快一下。
[/Quote]

你真牛。。。

其它的呢? 3,5,7,11之类的呢?
十八道胡同 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 forestdb 的回复:]
闲得蛋疼,看了下汇编码,就发现num % 2可以用num & 0x01来快一下。
[/Quote]
呵呵,位运算是快些。。
加载更多回复(3)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧