CCF-CSP备战NO.2高精度

发布时间:2026/9/23 19:36:57
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; }

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询