大数求模问题
分析:
首先由于x的位数很大,因此我们不能用现有的int,long,long long,double等数据类型进行存储,因为int和long都是4个字节即32位,long long和double都是8个字节64位,远远小于400位。所以我们要用特殊的方式来存储x。一般存储大数的方法是用一个字符串来表示,字符串的每一个字符代表大整数的每一位,这样不论整数有多少位我们都可以存储了。要得到这个字符代表的数字只需减去'0'即可。
解决了x的存储问题,就要进行取模运算了,由于x的表示法特殊,因此取模运算的方式也比较特殊,这里我们模拟手算竖式的方法。用x从高到低的每一位加上前一位余数*10来对bi进行%,最后得到的结果就是x%bi的结果。
举例说明:
PS. 红色圈出的部分就是每一步%运算的结果,最后橘色的部分就是最终结果。每一步的余数都要*10以后在加上下一位的数才能进行下一步的%运算。
求一个大整数对N个数的模,其实关键就只有这两句代码
for( i = 0; i < len; i++ ) ans = ( ans * 10 + (x[i] - '0') ) % num;
#include <iostream>
#include <string>
using namespace std;
void BigIntegerMod(string s,int l[] ,int m[],int n){
for(int j = 0 ; j < n ; j++ ) {
int temp = 0 ;
for(int i = 0 ; i < s.length() ; i++) {
temp = ( temp * 10 + (s[i] - '0') ) % l[j];
}
m[j] = temp;
}
cout << "(" << m[0];
for(int i = 1 ; i < n ; i++) {
cout << ","<<m[i];
}
cout << ")"<<endl;
}
int main(){
int tests;
int n;
int b[100],r[100];
string x;
cin >> tests;
for(int i = 0 ; i < tests ; i++) {
cin >> n;
for(int j = 0 ; j < n ; j++) {
cin >> b[j];
}
cin >> x;
BigIntegerMod(x,b,r,n);
}
}