高精度大数对低精度取余

91 阅读1分钟

高精度取余

原理:

num=sum10+Cnum = sum * 10 + C

任何一个数,都可以被表示成 num=((a010+a1)10+a2)10+a3num = ((a_0 * 10 + a_1) * 10 + a_2) * 10 + a_3

也就是一个十进制数的表示形式 ,类似二进制数。

如何形象理解

sum = (sum * 10 % mod + c) % mod;

这段代码呢?

(a010+a1)10+a2(a_0 * 10 + a_1) * 10 + a_2 假设算到这个就 大于我们的mod的了 , 那么其实这里直接对它取余即可,不影响后面的运算。因为取余运算对加法和乘法自由的

如果不了解,乘法和加法为什么是自由的。请查一下取余的性质。 这样就可以实现高精度数取模的操作了。

#include <iostream>
#include <cstring>
#include <algorithm>

#define LL long long
#define PII std::pair<int , int>

const int N = 100010 , mod = 1000000007;

int main(){
    
    std::ios::sync_with_stdio(0);
    std::cout.tie(0);
    std::cin.tie(0);


    std::string s;
    std::cin >> s;

    LL sum = 0;
    for (int i = 0; i < int(s.size()); i ++ ){
        int c = s[i] - '0';
        sum = (sum * 10 % mod + c) % mod;
    }

    std::cout << sum << '\n';

    
    return 0;
}