C++实现:处理超1000位正整数除法与取余的代码解析
在C++中处理大于标准数据类型范围的大整数,可以使用字符串来存储这些数字,并手动实现大整数的除法和取余操作。以下是一个实现该功能的代码示例: ```cpp #include <iostream> #include <string> #include <algorithm> using namespace std; // 辅助函数:比较两个大整数字符串的大小 bool compare(const string &num1, const string &num2) { if (num1.length() != num2.length()) { return num1.length() > num2.length(); } return num1 > num2; } // 辅助函数:减去两个大整数字符串,假设 num1 >= num2 string subtract(const string &num1, const string &num2) { string result; int carry = 0; int len1 = num1.length(), len2 = num2.length(); for (int i = 0; i < len1; ++i) { int digit1 = num1[len1 - 1 - i] - '0'; int digit2 = (i < len2) ? num2[len2 - 1 - i] - '0' : 0; int diff = digit1 - digit2 - carry; if (diff < 0) { diff += 10; carry = 1; } else { carry = 0; } result += diff + '0'; } // 去除前导零 while (result.length() > 1 && result.back() == '0') { result.pop_back(); } reverse(result.begin(), result.end()); return result; } // 主函数:计算大整数除法 pair<string, string> divideLargeNumbers(const string ÷nd, const string &divisor) { string quotient, remainder = dividend; string zero = "0"; // 特殊情况处理 if (dividend == divisor) return make_pair(zero + "1", zero); if (compare(divisor, dividend)) return make_pair(zero, dividend); for (int i = 0; i < dividend.length(); ++i) { // 模拟手工除法,每次将余数乘以10并加上当前位的数字 remainder = remainder.back() == '0' ? remainder.substr(0, remainder.length() - 1) : remainder + "0"; remainder += dividend[dividend.length() - 1 - i]; // 找到不大于当前余数的最大倍数 string tempDivisor = divisor; string tempQuotientDigit; while (compare(remainder, tempDivisor)) { tempQuotientDigit += '0' + (tempDivisor.length() == 1 ? tempDivisor[0] - '0' + 1 : '1'); tempDivisor += divisor; } tempQuotientDigit.back() -= 1; // 回退一位 // 更新余数和商 quotient += tempQuotientDigit.back() + '0'; remainder = subtract(remainder, tempDivisor.substr(0, tempQuotientDigit.back() - '0' + 1)); // 如果余数为0,提前结束 if (remainder == zero) break; } // 去除商的前导零 while (quotient.length() > 1 && quotient.back() == '0') { quotient.pop_back(); } reverse(quotient.begin(), quotient.end()); // 因为我们是从低位开始计算的,所以需要反转商 return make_pair(quotient, remainder); } int main() { string num1, num2; cin >> num1 >> num2; pair<string, string> result = divideLargeNumbers(num1, num2); cout << result.first << endl; cout << result.second << endl; return 0; } ``` 代码说明: 1. compare 函数:用于比较两个大整数字符串的大小。 2. subtract 函数:用于模拟大整数减法,假设 `num1 >= num2`。 3. divideLargeNumbers 函数:主函数,实现大整数除法。通过逐位处理被除数,模拟手工除法的过程。 4. main 函数:读取输入并调用 `divideLargeNumbers` 函数,输出结果。 逻辑点: 1. 大整数处理:由于输入数字可能非常大,需要使用字符串来存储和处理这些数字。 2. 手动实现算术运算:由于标准数据类型无法处理如此大的数字,因此需要手动实现大整数的加法和减法。 3. 模拟手工除法:通过逐位处理被除数,模拟手工除法的过程,计算商和余数。 ######[AI写代码神器 | 1125点数解答 | 2025-03-15 13:36:45]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)371
- Golang开发:解析JSON数据时数值默认类型及示例解析(百度文心 | 393点数解答 | 2023-11-09 18:13:06)302
- SQL Working Areas Sizing: Manual vs. Automatic Policy - A Comprehensive Analysis(阿里通义 | 530点数解答 | 2024-05-13 10:55:58)323
- CentOS下Java进程出现futex_wait_queue_me问题的处理全流程(阿里通义 | 283点数解答 | 2023-11-20 14:51:26)482
- 替雷利珠单抗致免疫相关性糖尿病:病例报道与机制探讨,为临床用药敲响警钟( | 164点数解答 | 2024-10-11 14:52:52)285
- Python 代码转 C++:计算花朵鲜艳值总和(字节豆包 | 408点数解答 | 2026-04-19 21:50:57)17
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)342
- C++ 实现查找指定数字在正整数序列中的位置(字节豆包 | 398点数解答 | 2026-04-11 13:08:06)25
- C++ 实现统计指定数字在数组中出现的次数(字节豆包 | 377点数解答 | 2026-04-11 13:09:11)24
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)493
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)378
- iOS开发:手把手教你完整实现代理模式,含声明与实现步骤!(阿里通义 | 268点数解答 | 2023-11-08 00:39:55)271