Skip to content

CS-MEDIUM-01 大数运算

标题

我们知道int是32位整数,long long是64位整数,当需要处理更大数值时,例如:

Plain
long long a = 9223372036854775807;
long long b = 9223372036854775807; // 2^63 - 1,最大64位整数
long long a = 9223372036854775807;
long long b = 9223372036854775807; // 2^63 - 1,最大64位整数

这两个数的和应为:

Plain
a + b = 18446744073709551614
a + b = 18446744073709551614

但若只用64位表示,那么计算结果将会出现溢出,导致错误的结果:

Plain
long long res = a + b; // 计算后的res为 -2(溢出后的错误结果)
long long res = a + b; // 计算后的res为 -2(溢出后的错误结果)

如何表示更高位数呢?我们可以使用字符数组来模拟大数运算。这种方法可以实现对超大数值的加减乘除运算。我们将处理不超过128位的整数,即在2¹²⁸-1范围内的数字。(不可直接使用__int128类型)

Part 1 理解大数运算

通过学习以下内容,你将了解如何处理大数运算。请学习相关资料并回答以下问题:

问题

  1. 为什么要使用字符数组来表示大数?
  2. 如何处理大数运算中的进位和借位问题?
  3. 如何处理负数

提交方式:文字叙述

Part 2 初步实现大数运算

Step 1 尝试存储大数

使用字符数组来表示大数,确保可以处理128位内的正整数

任务

  1. 定义一个字符数组来存储大数
  2. 编写代码将输入的数字存储到字符数组中,并输出该数字以验证输入是否正确

大数要求

  • 可解决的数字范围为0到 2¹²⁸-1

提交方式:提交正确的可执行的代码和截图展示运行结果

Step 2 实现大数加法

编写一个程序,完成两个正整数的大数加法运算

样例输入:

42535295865117307932921825928971026432
42535295865117307932921825928971026432
42535295865117307932921825928971026432
42535295865117307932921825928971026432

样例输出:

85070591730234615865843651857942052864
85070591730234615865843651857942052864

要求

  1. 使用字符数组来表示大数
  2. 实现加法运算
  3. 可解决的数字范围为:0到 2¹²⁸-1
  4. 输出结果

提交方式:提交正确的可执行的代码和截图展示运行结果

Step 3 实现大数加法(处理负数)

编写一个程序,完成两个大数(包含负数)的加法运算

样例输入:

-42535295865117307932921825928971026432
-42535295865117307932921825928971026432
-42535295865117307932921825928971026432
-42535295865117307932921825928971026432

样例输出:

-85070591730234615865843651857942052864
-85070591730234615865843651857942052864

要求

  1. 使用字符数组来表示大数
  2. 实现加法运算,处理正负数
  3. 可解决的数字范围为:-2¹²⁷2¹²⁷-1
  4. 输出结果

提交方式:提交正确的可执行的代码和截图展示运行结果

Part 3 从表达式中提取操作数和操作符

在运算中,我们需要让程序自主从字符串表达式中提取操作数和操作符。为了更好地实现大数运算,我们需要编写一个程序,能够解析并提取表达式中的操作数和操作符,并判断操作数的正负。

任务

​ 编写代码从输入表达式中提取操作数和操作符

样例输入:

42535295865117307932921825928971026432 - (-42535295865117307932921825928971026432)
42535295865117307932921825928971026432 - (-42535295865117307932921825928971026432)

样例输出:

操作数1: 42535295865117307932921825928971026432

操作数2: -42535295865117307932921825928971026432

操作符: -

提交方式:提交正确的可执行的代码和截图展示运行结果

Part 4 封装大数四则运算

为了简化大数运算的实现,我们将封装加减乘除运算为函数

样例保证负数在括号内

注意:

​ 所有操作数均可为大数,包括除法运算中的除数

样例输入1:

Plain
1180591620717411303424+(-590295810358705651712)
1180591620717411303424+(-590295810358705651712)

样例输出1:

Plain
590295810358705651712
590295810358705651712

样例输入2:

Plain
1180591620717411303424-590295810358705651712
1180591620717411303424-590295810358705651712

样例输出2:

Plain
590295810358705651712
590295810358705651712

样例输入3:

Plain
1180591620717411303424*1024
1180591620717411303424*1024

样例输出3:

Plain
1208925819614629174706176
1208925819614629174706176

样例输入4:

Plain
1208925819614629174706176/(-1180591620717411303424)
1208925819614629174706176/(-1180591620717411303424)

样例输出4:

Plain
-1024
-1024

任务

  1. 实现加法、减法、乘法和除法的函数,处理正负数
  2. 在主函数中调用这些函数,并输出结果

提交方式:提交正确的可执行的代码和截图展示运行结果

需要掌握的知识点

  1. 字符数组的初始化、输入、输出和基本操作方法
  2. 掌握字符串的长度计算、字符转数字、数字转字符等基本操作,熟悉字符串的遍历和操作技巧
  3. 学会在程序中模拟进位和借位操作
  4. 符号位的概念

本题提交方式

提交点这里

主题示例:2024090101012-张三-CS-04

出题人联系方式

Js

QQ:3588856175

邮箱:13689050454@163.com