• C++知识点总结(6):高精度乘法


    一、高精度数 × 低精度数

    1. 输入两个数字

    1. char a_str[1005] = {};
    2. long long b;
    3. cin >> a_str >> b;

    2. 将高精度数转换为整型

    1. int a[1005] = {};
    2. int len_a = strlen(a_str);
    3. for (int i = 0; i <= len_a-1; i++)
    4. {
    5. a[len_a-i-1] = a_str[i] - 48;
    6. }

    3. 计算

    1. int len_ans = len_a;
    2. long long ans[1005] = {};
    3. long long in = 0;
    4. for (int i = 0; i <= len_ans-1; i++)
    5. {
    6. ans[i] = a[i] * b + in; // 存储数字
    7. in = ans[i] / 10; // 得到进位
    8. ans[i] %= 10; // 在对应的数位上保留实际得数的最后一位
    9. }

    4. 输出结果

    1. while (in > 0) // 最高位处理
    2. {
    3. ans[len_ans] = in % 10;
    4. len_ans++;
    5. in /= 10;
    6. }
    7. // 正常输出
    8. for (int i = len_ans - 1; i >= 0; i--)
    9. {
    10. cout << ans[i];
    11. }

    5. 注意一个特例先行

    1. if (a == 0 || b == 0)
    2. {
    3. cout << 0;
    4. return 0;
    5. }

    6. 完整代码

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. // 存储并输出两个数字
    7. char a_str[1005] = {};
    8. long long b;
    9. cin >> a_str >> b;
    10. // 特例先行:结果是0的情况
    11. if (a == 0 || b == 0)
    12. {
    13. cout << 0;
    14. return 0;
    15. }
    16. // 转换第一个高精度数
    17. int a[1005] = {};
    18. int len_a = strlen(a_str);
    19. for (int i = 0; i <= len_a-1; i++)
    20. {
    21. a[len_a-i-1] = a_str[i] - 48;
    22. }
    23. // 计算
    24. int len_ans = len_a;
    25. long long ans[1005] = {};
    26. long long in = 0;
    27. for (int i = 0; i <= len_ans-1; i++)
    28. {
    29. ans[i] = a[i] * b + in; // 存储数字
    30. in = ans[i] / 10; // 得到进位
    31. ans[i] %= 10; // 在对应的数位上保留实际得数的最后一位
    32. }
    33. // 输出结果
    34. while (in > 0) // 最高位处理
    35. {
    36. ans[len_ans] = in % 10;
    37. len_ans++;
    38. in /= 10;
    39. }
    40. // 正常输出
    41. for (int i = len_ans - 1; i >= 0; i--)
    42. {
    43. cout << ans[i];
    44. }
    45. return 0;
    46. }
    47. /*
    48. 注明:
    49. 由于是从编译器中复制过来的,所以缩进有些难看,大家可以自行调整(复制到本地编译器还是可以的)。
    50. */

    二、高精度数 × 高精度数

            计算思路改变了一些,其他不变。

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. // 存储并输出两个数字
    7. char a_str[1005] = {};
    8. char b_str[1005] = {};
    9. cin >> a_str >> b_str;
    10. // 转换高精度数
    11. int a[1005] = {};
    12. int b[1005] = {};
    13. int len_a = strlen(a_str);
    14. int len_b = strlen(b_str);
    15. for (int i = 0; i <= len_a-1; i++)
    16. {
    17. a[len_a-i-1] = a_str[i] - 48;
    18. }
    19. for (int i = 0; i <= len_b-1; i++)
    20. {
    21. b[len_b-i-1] = b_str[i] - 48;
    22. }
    23. // 计算
    24. int ans[2010] = {};
    25. int in = 0;
    26. for (int j = 0; j <= len_b-1; j++)
    27. {
    28. for (int i = 0; i <= len_a-1; i++)
    29. {
    30. ans[i+j] = a[i] * b[j] + in + ans[i+j];
    31. in = ans[i+j] / 10;
    32. ans[i+j] %= 10;
    33. }
    34. // 最高位处理
    35. ans[len_a+j] = in;
    36. in = 0; // 重置进位
    37. }
    38. // 正常输出
    39. int len_ans = len_a + len_b; // 结果的最大位数
    40. // 前导0
    41. while (ans[len_ans-1] == 0 && len_ans > 1)
    42. {
    43. len_ans--;
    44. }
    45. for (int i = len_ans - 1; i >= 0; i--)
    46. {
    47. cout << ans[i];
    48. }
    49. return 0;
    50. }

    三、高精度平方计算器

            首先我们要知道,n的平方(记作n²)相当于n ×n,其实我们可以按照高精度数 × 高精度数的思想来完成。

    •  想法1:将所有b都改为a。
    •  想法2:使用strcpy()函数直接将a的值赋值给b。

            建议采用想法2,示例代码如下:

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. // 存储并输出两个数字
    7. char a_str[1005] = {};
    8. char b_str[1005] = {};
    9. cin >> a_str;
    10. strcpy(b_str, a_str);
    11. // 转换高精度数
    12. int a[1005] = {};
    13. int b[1005] = {};
    14. int len_a = strlen(a_str);
    15. int len_b = strlen(b_str);
    16. for (int i = 0; i <= len_a-1; i++)
    17. {
    18. a[len_a-i-1] = a_str[i] - 48;
    19. }
    20. for (int i = 0; i <= len_b-1; i++)
    21. {
    22. b[len_b-i-1] = b_str[i] - 48;
    23. }
    24. // 计算
    25. int ans[2010] = {};
    26. int in = 0;
    27. for (int j = 0; j <= len_b-1; j++)
    28. {
    29. for (int i = 0; i <= len_a-1; i++)
    30. {
    31. ans[i+j] = a[i] * b[j] + in + ans[i+j];
    32. in = ans[i+j] / 10;
    33. ans[i+j] %= 10;
    34. }
    35. // 最高位处理
    36. ans[len_a+j] = in;
    37. in = 0; // 重置进位
    38. }
    39. // 正常输出
    40. int len_ans = len_a + len_b; // 结果的最大位数
    41. // 前导0
    42. while (ans[len_ans-1] == 0 && len_ans > 1)
    43. {
    44. len_ans--;
    45. }
    46. for (int i = len_ans - 1; i >= 0; i--)
    47. {
    48. cout << ans[i];
    49. }
    50. return 0;
    51. }

    四、高精度阶乘计算器

            注释已经详细地注明了,大家自己看一看即可。

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. // 输入
    7. int n;
    8. cin >> n;
    9. // 初始化计算相关变量
    10. int in = 0;
    11. int ans[10005] = {1};
    12. int len_ans = 1;
    13. // 计算阶乘
    14. for (int num = 1; num < n; num++) // num是对应的因数(即3! = 1 * 2 * 3中的1、2、3)
    15. {
    16. // 高精度数 ×低精度数代码
    17. for (int i = 0; i <= len_ans-1; i++)
    18. {
    19. ans[i] = ans[i] * num + in; // ans[i] = 上一轮的结果 * 下一个因数 + 上一次的进位
    20. in = ans[i] / 10;
    21. ans[i] %= 10;
    22. }
    23. while (in)
    24. {
    25. ans[len_ans] = in % 10;
    26. len_ans++;
    27. in /= 10;
    28. }
    29. }
    30. for (int i = 1; i <= len_ans; i++)
    31. {
    32. cout << ans[i];
    33. }
    34. return 0;
    35. }

    今日收获

            这样,高精度就只剩下下周要研究的高精度除法啦( ̄︶ ̄)加油!

  • 相关阅读:
    PMP 11.27 考试倒计时15天!冲刺啦!
    企业级的商用远程控制软件有哪些
    如何做好测试?(二)单元测试(Unit Testing, UT)
    Linux搭建Zookeeper伪集群详解
    小试单一职责原则
    华为云云耀云服务器L实例评测|华为云云耀云服务器L实例评测使用
    护理教育学考试复习题
    mysql buffer pool详解
    Android 从零开发一个简易的相机App
    客服回复差评的话术模板
  • 原文地址:https://blog.csdn.net/joe_g12345/article/details/134482901