【小韦同学@神犇营-my1036-大数取模】
题目:
描述
你需要实现一个程序,计算一个整数 A 对一个整数 B 取模的结果。
输入
第一行读入一个整数 T(1 ≤ T ≤ 100),表示一共要计算多少次取模。
接下来一共 T 行,每行两个正整数 A、B,A 为不超过 200 位的整数,1 ≤ B ≤ 10^8。
输出
一行输出 T 行,每行一个整数表示 A mod B 的结果。
输入样例1
2
100 7
98765 11
输出样例1
2
7
题解:
/*********************************************************************
* 题目:神犇营-my1036-大数取模
* 作者:小韦同学
* 邮箱:weichangying_wcy@163.com
* 题解:
思路:
如果一个数 A = a_n a_(n-1)...a_3 a_2 a_1 a_0,这个数可以表示为:
A = a_0 * 10^0 + a_1 * 10^1 + a_2 * 10^2 + a_3 * 10^3 +...+ a_n^n
根据同余定理,得出下面的结论:
(a + b) % m == (a % m + b % m) % m
(a * b) % m == ((a % m) * (b % m)) % m
故A % m == ((a_0 * 10^0) % m + (a_1 * 10^1) % m + (a_2 * 10^2) % m +
(a_3 * 10^3) % m +...+ (a_n * 10^n) % m) % m
本题中,将字符串num用来存大数,从低位取每一个数字,乘以对应的幂次之后
加到ans中,用ans来存大数转成的数字,不过在每次加到ans之后,要模m,避免
溢出的情况。
*********************************************************************/
#include <bits/stdc++.h>
using namespace std;
int main() {
//freopen("5.in", "r", stdin);
//freopen("5.out", "w", stdout);
string num;
int t, b;
cin >> t;
while (t--) {
long long ans = 0;
cin >> num >> b;
for (int i = 0; i < num.length(); i++) {
ans = ans * 10 + num[i] - '0';
ans %= b;
}
cout << ans << endl;
}
return 0;
}
我是小韦同学,企者不立,跨者不行,每天进步一点点。
欢迎大家多多交流,如果发现有错误,请多指正。有疑问的同学也可以留言评论或者发邮件。
邮箱:weichangying_wcy@163.com