sicily 1020. Big Integer
Long long ago, there was a super computer that could deal with VeryLongIntegers(no VeryLongInteger will be negative). Do you know how this computer stores the VeryLongIntegers? This computer has a set of n positive integers: b1,b2,...,bn, which is called a basis for the computer.
The basis satisfies two properties:
1) 1 < bi <= 1000 (1 <= i <= n),
2) gcd(bi,bj) = 1 (1 <= i,j <= n, i ≠ j).
Let M = b1*b2*...*bn
Given an integer x, which is nonegative and less than M, the ordered n-tuples (x mod b1, x mod b2, ..., x mod bn), which is called the representation of x, will be put into the computer.
The input consists of T test cases. The number of test cases (T) is given in the first line of the input.
Each test case contains three lines.
The first line contains an integer n(<=100).
The second line contains n integers: b1,b2,...,bn, which is the basis of the computer.
The third line contains a single VeryLongInteger x.
Each VeryLongInteger will be 400 or fewer characters in length, and will only contain digits (no VeryLongInteger will be negative).
The output format is:(r1,r2,...,rn)
2 3 2 3 5 10 4 2 3 5 7 13
(0,1,0) (1,1,3,6)
#include <iostream> #include <string> #include <string.h> using namespace std; int* findMod(string str, int* arr, int len) { int size = str.size(); int* arrt = new int[len]; memset(arrt, 0, sizeof(int) * len); for (int i = 0; i != size; ++i) { for (int j = 0; j != len; ++j) { arrt[j] = (arrt[j] * 10 + (str[i] - '0')) % arr[j]; } } return arrt; } int main(int argc, char* argv[]) { int T, n, *arr; string x; cin >> T; while (T--) { cin >> n; arr = new int[n]; for (int i = 0; i != n; ++i) cin >> arr[i]; cin >> x; int *result = findMod(x, arr, n); cout << "("; for (int i = 0; i != n - 1; i++) cout << result[i] << ","; cout << result[n - 1] << ")" << endl; } return 0; }
因为给的空间还是很大的,所以我在mod的时候用空间换时间,其实这样实现是不好的,因为申请的空间根本没释放。下面这样的话比较好一点,时间上也只是差了0.07多