自己做的模幂运算太肤浅了

常说的一句话就是:“是骡子是马拉出来溜溜”,算法课上学习了素数测试的算法,可是在实践中当两个大数相乘的时候就会出现溢出的现象,上算法实验课的时候,一道题目就是要测试素数,其中有一个2^31此方级的梅森素数,如果按原来的直接相乘然后取模的方法就会出现溢出,怎么都不能通过,这道题目上卡了我半天(虽然我有差不过一年的程序设计竞赛的基础),最后还是我们系的ACM强人提供了下面的方法,改了之后才通过那道题的。

 static long long Mod(long long x,long long y,long long n){
  if(!x)return 0;
  return(((x&1)*y)%n+(Mod(x>>1,y,n)<<1)%n)%n;
 
 }

看看,其实想法很简单,就是保证将大数降幂,然后在还原回去并取模。然后又在网上搜了一下模幂运算的优化方法,才发现以前的想法是多么的弱智,原来模幂运算可以从时间和空间上去的很多的优化的,哎,编程方面的技巧是非常的多的,如果没有实践的经验,临时去想出一道题目的解法是很困难的。很多时候,当你面对一个问题的时候,一个解题的层次是,我去搜搜,然后看到别人怎么做的,学着掌握这种方法,在看到同样的问题的时候,就可以很快的解决出来了,这种层次不是我羡慕的,这是你不会仅仅是因为你没有见过,但是有一种更高深的层次就是,在面对一个题目的时候,去分析这个问题的性质,然后去建立一个数学模型,提出该模型的性质,然后利用这些性质去解决问题,这个层次的人是相当可怕的。正所谓“只在此山中,云深不知处啊”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值