1. 程式人生 > >Sicily 1020. Big Integer | 大整數取模運算

Sicily 1020. Big Integer | 大整數取模運算

題目:
這裡寫圖片描述

•題意:輸入n個整數bi(1 <= i <= n),以及一個大整
數x,輸出一個n元組(x mod b1,x mod b2,…,x
mod bn)
• 約束: n <= 100, 1 < bi <= 1000 (1 <= i <= n) 大整數x的位數
m <= 400並且非負

思路:
• mod 操作(對應C++中的%操作符)的性質:
• (a + b) % n == (a % n + b % n) % n
• (a * b) % n == ((a % n) * (b % n)) % n
• 所以我們要儲存的值都是在模意義下的

• 大整數處理的常用辦法
• 例如: 1234=(((1 * 10 + 2) * 10 + 3) * 10) + 4
• 再利用前面mod操作的性質我們可以知道:
• 1%7 = 1
• 12%7 = (((1 % 7) * 10) % 7 + 2) % 7 = 5
• 123%7 = (((12 % 7) * 10) % 7 + 3) % 7 = 4
• 1234%7 = (((123 % 7) * 10) % 7 + 4) % 7 = 2

程式碼:

// Problem#: 1020
// Submission#: 4531242
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/ // All Copyright reserved by Informatic Lab of Sun Yat-sen University #include <iostream> #include <string> #include <cstring> using namespace std; int b[1010]; int mod(string s, int n) { int len = s.length(); int res = 0; for
(int i = 0; i < len; i++) { res =( (res*10) % n + s[i] -'0') % n; } return res; } int main() { int testcase; int num; cin >> testcase; string str; while(testcase--) { cin >> num; for(int i = 1; i <= num; i++) { cin >> b[i]; } cin >> str; cout << "("; for(int i = 1; i < num; i++) { cout << mod(str,b[i]) << ","; } cout << mod(str, b[num]) << ")" << endl; } }