麦森数 poj http://poj.grids.cn/solution/1154879/

来源:互联网 发布:证件p图软件 编辑:程序博客网 时间:2024/05/22 15:37

题目:http://poj.grids.cn/solution/1154879/

个人认为这道题 在高精度计算中应该是算有难度的,这道题用了很多技巧

1首先2^p计算要用到一个技巧:

首先把p用二进制表示

p=a0*2^0+a1*2^1+……+an*2^n-1+2^n;

那么

2^p=2^a0*2^2a1*2^4a2*……*2^2^n;

用算法表示就是

 while(P)
 {
  if(P&1)
   multiply(a1,a2);
  multiply(a2,a2);
  P>>=1;
 }

这个思想我理解了很久,按我现在的能力也不知道怎么推出这个算法为何快。。

但是,想想,其实就好比 8个2相加,如果一个2一个2的加这样的速度一定很慢,但是如果是先两个2相加得4,在两个4相加得8,两个8得16,两个16得32,这样的话是不是快多了,我的启发就在这种类比的方法,但我估计很少人能理解我的意思。语言表达有待改进。。呵呵

 

2还有一点就是要用一万进制来储存数字,加快运算速度,假如不这样的话,我们要开辟500位的数组,每次乘法运行 (500+1)*250=125250次普通乘法,而用一万制之后只需(125+1)*62.5=7875次普通乘法,效率自然不同;

 

3只能用一万制,如果为了方便用十万制的话,即使是unsigned long 也可能存不下计算过程中出现的数,例如 500000^2

 

4还有就是换行的技巧,是i%25==12,阶段换行,这个得慢慢体会,我也不知道怎么说。。

 

5不要妄想像计算高精度乘法那道题那样,先算完后,再处理进位,因为如果那样的话,计算过程会出现很大的数,int无法保存,long貌似也不行,得边计算边进位才行。

 

好了,给代码吧,这代码改了几次后,发现那代码几乎跟答案完全一样,纳闷。。

 

 

 

 

 

原创粉丝点击