本课时有配套视频讲解,购买后即可观看(永久有效)
高精度除运算
课上练习
- 高精度除运算:L3041
测试数据:
知识总结
高精度除运算-课程清单 概念 高精度运算是指在计算机科学和数值计算中,能够处理和运算非常大的数字的技术。在编程中,普通的整数类型(如 int 或 long)有其最大值的限制,超过这个范围的运算就会溢出。为了处理更大的数字,比如在大数加密、科学计算或经济模型分析中,就需要用到高精度(大数)运算。
算法原理 使用string类变量来存储整个大数,字符串的每个字符可以直接映射到每一位上的数字。 将每一位上的数字正序存储进数组中。 从高位到对到低位完成对应位相除的操作。 清除前导零,正序输出按位除的结果。
标准代码
1#include <iostream>
2using namespace std;
3
4// 将字符串s中的数字倒序转换为整数数组a
5void convert(int a[], string s) {
6 int len = s.length(); // 获取字符串长度
7 for (int i = 0; i < len; i++) {
8 a[i] = s[len - 1 - i] - '0'; // 倒序存储,便于从最高位开始运算
9 }
10}
11
12// 打印整数数组a表示的数字,数组中数字是倒序存储的
13void print(int a[], int len) {
14 for (int i = 0; i < len; i++) {
15 cout << a[len - 1 - i]; // 从后向前打印数组元素,以正确顺序显示数字
16 }
17 cout << endl;
18}
19
20// 执行高精度除法运算
21void division(int a1[], int len1, int a2, int result[], int &len) {
22 int remainder = 0; // 初始化余数
23 for (int i = len1 - 1; i >= 0; i--) {
24 remainder = remainder * 10 + a1[i]; // 将余数乘以基数10并加上当前位的数字
25 result[i] = remainder / a2; // 计算当前位的商
26 remainder %= a2; // 更新余数
27 }
28 while (result[len - 1] == 0 && len > 1) { // 清除结果前导0,但至少保留一位数字
29 len--;
30 }
31}
32
33int main() {
34// freopen("division4.in", "r", stdin); // 从文件读取输入
35// freopen("division.out", "w", stdout); // 将输出写入文件
36 string s1;
37 int a1[105] = {0}; // 存储数字的数组,初始化为0
38 int a2 = 0; // 存储除数
39 cin >> s1 >> a2; // 读取被除数和除数
40 int len1 = s1.length(); // 获取被除数的长度
41 convert(a1, s1); // 转换被除数为整数数组
42
43 int result[105] = {0}; // 存储结果的数组,初始化为0
44 int len = len1; // 设置结果长度初值为被除数的长度
45
46 division(a1, len1, a2, result, len); // 执行除法运算
47
48 print(result, len); // 打印结果
49 return 0;
50}️课后作业
☝️总结作业
总结作业非常重要,请务必认真完成✔️
- 请写出高精度除运算的关键步骤。
- 高精度除运算的时间复杂度。
✌️编程作业
考试只有一次提交机会,请务必本地检查正确后再提交❇️
- 除以13:L3042