取模运算

举报
兔老大 发表于 2021/04/20 00:26:11 2021/04/20
【摘要】 取模运算(“Modulo Operation”)和取余运算(“Complementation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。取模主要是用于计算机术语中。取余则更多是数学概念。模运算在数论和程序设计中都有着广泛的应用,比如: 从奇偶数的判别 素数的判别 模幂运算 最大公约数的求法 孙子问题 凯撒密码问题 虽然...

取模运算(“Modulo Operation”)和取余运算(“Complementation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。取模主要是用于计算机术语中。取余则更多是数学概念。模运算在数论和程序设计中都有着广泛的应用比如:

从奇偶数的判别

素数的判别

幂运算

最大公约数的求法

孙子问题

凯撒密码问题

虽然很多数论教材上对模运算都有一定的介绍,但多数都是以纯理论为主,对于模运算在程序设计中的应用涉及不多。

为什么需要求余数呢?

如果计算结果超出64位整数范围,就可能会输出结果对某个数取模后的结果。这样可以消除在高精度方面,由于语言的差异造成的不公和一些不利因素。例如,java里有支持高精度的类BIGINTEGER,python整数基本没有范围一说,而c系列就要靠自己实现。

另一方面,高精度乘法不同实现的复杂度也不一样,对算法本身的评价更为困难。为了将重点放在对算法本身的评价上,竞赛中经常出现取余运算。

我们不需要掌握太多相关运算规则,够用即可。

1、n % p 得到结果的正负由被除数n决定,与p无关。例如:7%4 = 3, -7%4 = -3, 7%-4 = 3, -7%-4 = -3。

2、大数取模可能比小数取模得出的结果更小,所以要输出最后结果可能是负数,我们可以这样输出:

(A-B+MOD)%MOD,其中AB是取模以后的数。

3、 (a + b) % p = (a % p + b % p) % p

(a - b) % p = (a % p - b % p) % p

(a * b) % p = (a % p * b % p) % p

a ^ b % p = ((a % p)^b) % p

 

贴几个大水问题code好了

快速幂取模


  
  1. long long quick_mod(long long a, long long n, long long m)
  2. {
  3. long long ans = 1;
  4. while (n)
  5. {
  6. if (n & 1)
  7. ans = (ans * a) % m;
  8. n >>= 1;
  9. a = a * a % m;
  10. }
  11. return ans;
  12. }

乘法取模


  
  1. long long mul_mod(long long a, long long b, long long m) // a * b % m
  2. {
  3. long long ret = 0;
  4. while (b)
  5. {
  6. if (b & 1)
  7. ret = (ret + a) % m;
  8. b >>= 1;
  9. a = (a << 1) % m;
  10. }
  11. return ret;
  12. }

 

哦,最后提醒自己,以后遇见题直接上long long,再int自己扇自己

 

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/81488400

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。