• C++知识点总结(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. }

    二、高精度数 × 高精度数

    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. }

     三、高精度数的平方

    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是对应的因数
    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. }

    建议结合课程学习:

    戳进课程入口>>

  • 相关阅读:
    前端部署项目
    vin图像识别易语言代码
    接口压力测试 jmeter--进阶篇(三)
    react-navigation 6.x 学习(3)
    3 Cadence R8051XC2 芯片IP的寄存器介绍
    MySQL分库分表
    纽约时报起诉OpenAI和微软将决定未来LLM的发展
    yocto(六)——搭建yocto环境
    Swagger未授权访问漏洞
    微前端(qiankun)主应用共享React组件
  • 原文地址:https://blog.csdn.net/joe_g12345/article/details/134484563