CCF-CSP备战NO.2高精度

📅 发布时间:2026/7/27 23:32:56
CCF-CSP备战NO.2高精度 高精度加法#include bits/stdc.h using namespace std; string addBigNumbers(string num1, string num2) { int len1 num1.size(), len2 num2.size(); int maxLen max(len1, len2); int carry 0; string result; reverse(num1.begin(), num1.end()); reverse(num2.begin(), num2.end()); for (int i 0; i maxLen; i) { int digit1 (i len1) ? (num1[i] - 0) : 0; int digit2 (i len2) ? (num2[i] - 0) : 0; int sum digit1 digit2 carry; carry sum / 10; result.push_back((sum % 10) 0); } if (carry 0) { result.push_back(carry 0); } reverse(result.begin(), result.end()); return result; } int main() { string num1, num2; cin num1 num2; cout addBigNumbers(num1, num2) endl; return 0; }高精度减法#include iostream #include string #include algorithm using namespace std; // 比较两个数字字符串大小num1 num2 返回true bool isBigger(string num1, string num2) { if (num1.size() ! num2.size()) return num1.size() num2.size(); // 长度相同逐位对比 for (int i 0; i num1.size(); i) { if (num1[i] ! num2[i]) return num1[i] num2[i]; } return true; // 两数相等 } // 高精度减法返回 num1 - num2 (调用前保证num1 num2) string subBigNumbers(string num1, string num2) { int len1 num1.size(), len2 num2.size(); int maxLen max(len1, len2); int borrow 0; // 借位标记 string result; // 反转字符串从低位开始计算 reverse(num1.begin(), num1.end()); reverse(num2.begin(), num2.end()); for (int i 0; i maxLen; i) { int digit1 (i len1) ? (num1[i] - 0) : 0; int digit2 (i len2) ? (num2[i] - 0) : 0; digit1 - borrow; // 先减去上一轮借位 borrow 0; if (digit1 digit2) { digit1 10; borrow 1; // 需要向高位借1 } int sub digit1 - digit2; result.push_back(sub 0); } // 去除末尾多余的0反转后末尾是原数字高位前导0 while (result.size() 1 result.back() 0) { result.pop_back(); } reverse(result.begin(), result.end()); return result; } int main() { string num1, num2; cin num1 num2; if (isBigger(num1, num2)) { cout subBigNumbers(num1, num2) endl; } else { cout - subBigNumbers(num2, num1) endl; } return 0; }高精度乘法#include iostream #include string #include algorithm using namespace std; string mulBigNumbers(string num1, string num2) { int len1 num1.size(), len2 num2.size(); // 两数相乘结果长度最多 len1 len2 vectorint res(len1 len2, 0); // 反转低位在前 reverse(num1.begin(), num1.end()); reverse(num2.begin(), num2.end()); // 逐位相乘 for (int i 0; i len1; i) { int digit1 num1[i] - 0; for (int j 0; j len2; j) { int digit2 num2[j] - 0; res[i j] digit1 * digit2; res[i j 1] res[i j] / 10; // 进位 res[i j] % 10; } } string result; // 转字符串 for (int x : res) result.push_back(x 0); // 去掉前导0反转后末尾是高位 while (result.size() 1 result.back() 0) result.pop_back(); reverse(result.begin(), result.end()); return result; } int main() { string num1, num2; cin num1 num2; cout mulBigNumbers(num1, num2) endl; return 0; }高精度除法#include iostream #include string #include algorithm using namespace std; // 比较数字字符串大小a b 返回true bool isGreater(string a, string b) { if (a.length() ! b.length()) return a.length() b.length(); for (int i 0; i a.size(); i) { if (a[i] ! b[i]) return a[i] b[i]; } return true; } // 高精度减法a-b保证ab返回结果字符串 string sub(string a, string b) { reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); string res; int borrow 0; for (int i 0; i a.size(); i) { int da a[i] - 0 - borrow; int db (i b.size()) ? (b[i] - 0) : 0; borrow 0; if (da db) { da 10; borrow 1; } res.push_back(da - db 0); } // 去除末尾多余0 while (res.size() 1 res.back() 0) res.pop_back(); reverse(res.begin(), res.end()); return res; } // 高精度除法num1 / num2返回商rem保存余数 string divBigNumbers(string num1, string num2, string rem) { string quotient; rem ; // 余数初始为空 // 逐位取被除数模拟竖式除法 for (char ch : num1) { rem ch; // 去除余数前导0 while (rem.size() 1 rem[0] 0) rem.erase(rem.begin()); int cnt 0; // 能减除数就一直减统计商当前位数字 while (isGreater(rem, num2)) { rem sub(rem, num2); cnt; } quotient.push_back(cnt 0); } // 去除商前导0 while (quotient.size() 1 quotient[0] 0) quotient.erase(quotient.begin()); // 处理余数前导0 while (rem.size() 1 rem[0] 0) rem.erase(rem.begin()); return quotient; } int main() { string num1, num2, remainder; cin num1 num2; string ans divBigNumbers(num1, num2, remainder); cout 商 ans endl; cout 余数 remainder endl; return 0; }