Fantasy-JXF
  • Introduction
  • 机器学习
    • 机器学习基础
    • 机器学习实践
    • 机器学习算法
    • 集成学习
  • 深度学习
    • 深度学习基础
    • 深度学习实践
    • CNN
    • RNN
    • 优化算法
    • 序列建模
    • 《深度学习》整理
    • 术语表
  • 自然语言处理
    • NLP发展趋势
    • 自然语言处理基础
    • 句嵌入
    • 词向量
    • 多模态
    • 视觉问答(VQA)综述
    • 深度查询理解
      • 综述
  • 计算机视觉
    • 基本模型
  • 数学
    • 概率论
    • 微积分的本质
    • 深度学习的核心
  • 算法
    • 字符串
    • 数据结构
    • 数据结构Advanced
    • 双指针
    • 动态规划
    • 区间问题
    • 排列组合
    • 数学问题
    • 洗牌/采样/随机数
    • 大数运算
    • 海量数据处理
    • IO模板
    • 必备算法
    • LeetCode
    • 剑指Offer
    • 面试真题
  • 编程
    • C++基础
    • C++面向对象
    • C++左值与右值
    • Python基础
  • 笔试面经
    • 360
    • iHandy
    • 作业帮
    • 字节跳动
    • 小米
    • 度小满
    • 快手
    • 招行
    • 搜狐畅游
    • 滴滴
    • 爱奇艺
    • 百度
    • 百度2
    • 百度3
    • 百词斩
    • 腾讯
    • 迅雷
    • 顺丰
    • 旷视
    • 爱笔
    • 魔门塔
    • 搜狐
由 GitBook 提供支持
在本页
  • Index
  • 大数取模
  • 取模运算的性质
  • 快速幂取模
  • 大数加/减/乘/除

这有帮助吗?

  1. 算法

大数运算

上一页洗牌/采样/随机数下一页海量数据处理

最后更新于6年前

这有帮助吗?

Index

大数取模

取模运算的性质

  • 因为 (a%n) - (b%n) 可能小于 n,所以 +n

  • 因为 (a%n)(b%n) 可能溢出,计算前应该强转为 long long

Code - C++

  • 输入 a 为长度小于 1000 的字符串,b 为小于 100000 的整数

    int big_mod(const string& a, int b) {
        long ret = 0;  // 防止 ret * 10 溢出
        for (auto c : a) {
            ret = ((ret * 10) % b + (c - '0') % b) % b;  // ret = ((ret * 10) + (c - '0')) % b
        }
        return (int)ret;
    }
    
    /* 示例说明
    1234 % 11 == ((((0*10 + 1)*10 + 2)*10 + 3)*10 + 4) % 11
              == ((((0*10 + 1)*10 + 2)*10 + 3)*10 % 11 + 4 % 11) % 11
              == ((((0*10 + 1)*10 + 2)*10 % 11 + 3 % 11)*10 % 11 + 4 % 11) % 11
              == ((((0*10 + 1)*10 % 11 + 2 % 11)*10 % 11 + 3 % 11)*10 % 11 + 4 % 11) % 11
              == ((((0*10 % 11 + 1 % 11)*10 % 11 + 2 % 11)*10 % 11 + 3 % 11)*10 % 11 + 4 % 11) % 11

快速幂取模

  • 计算 a^n % b

  • 基本方法:根据取模的性质 3 —— ab % m == (a%m)(b%m) % m

    int big_mod(int a, int n, int b) {
        long long ret = 1;
        while(n--) {
            ret *= a % b;
            ret %= b;
        }
        return (int)ret;
    
    }
    • 时间复杂度 O(N)

  • 快速幂取模

    int big_mod(int a, int n, int b) {
        long long ret = 1;
        while(n) {
            if (n & 1)
                ret = (ret*a) % b;
            a = (a*a) % b;
            n >>= 1;
        }
        return (int)ret;
    }
    • 代码跟快速幂很像

    • 示例说明

      2^10 % 11 == (2^5 % 11)(2^5 % 11) % 11
                == ((2 % 11)(2^4 % 11))((2 % 11)(2^4 % 11)) % 11
                == ...

大数加/减/乘/除

- 博客园

大数取模
取模运算的性质
快速幂取模
大数加/减/乘/除
大数的四则运算(加法、减法、乘法、除法) - 落枫飘飘