CS-MEDIUM-01 大数运算
我们知道int
是32位整数,long long
是64位整数,当需要处理更大数值时,例如:
long long a = 9223372036854775807;
long long b = 9223372036854775807; // 2^63 - 1,最大64位整数
long long a = 9223372036854775807;
long long b = 9223372036854775807; // 2^63 - 1,最大64位整数
这两个数的和应为:
a + b = 18446744073709551614
a + b = 18446744073709551614
但若只用64位表示,那么计算结果将会出现溢出,导致错误的结果:
long long res = a + b; // 计算后的res为 -2(溢出后的错误结果)
long long res = a + b; // 计算后的res为 -2(溢出后的错误结果)
如何表示更高位数呢?我们可以使用字符数组来模拟大数运算。这种方法可以实现对超大数值的加减乘除运算。我们将处理不超过128位的整数,即在2¹²⁸-1范围内的数字。(不可直接使用__int128类型)
Part 1 理解大数运算
通过学习以下内容,你将了解如何处理大数运算。请学习相关资料并回答以下问题:
问题:
- 为什么要使用字符数组来表示大数?
- 如何处理大数运算中的进位和借位问题?
- 如何处理负数
提交方式:文字叙述
Part 2 初步实现大数运算
Step 1 尝试存储大数
使用字符数组来表示大数,确保可以处理128位内的正整数
任务:
- 定义一个字符数组来存储大数
- 编写代码将输入的数字存储到字符数组中,并输出该数字以验证输入是否正确
大数要求:
- 可解决的数字范围为0到 2¹²⁸-1
提交方式:提交正确的可执行的代码和截图展示运行结果
Step 2 实现大数加法
编写一个程序,完成两个正整数的大数加法运算
样例输入:
42535295865117307932921825928971026432
42535295865117307932921825928971026432
42535295865117307932921825928971026432
42535295865117307932921825928971026432
样例输出:
85070591730234615865843651857942052864
85070591730234615865843651857942052864
要求:
- 使用字符数组来表示大数
- 实现加法运算
- 可解决的数字范围为:0到 2¹²⁸-1
- 输出结果
提交方式:提交正确的可执行的代码和截图展示运行结果
Step 3 实现大数加法(处理负数)
编写一个程序,完成两个大数(包含负数)的加法运算
样例输入:
-42535295865117307932921825928971026432
-42535295865117307932921825928971026432
-42535295865117307932921825928971026432
-42535295865117307932921825928971026432
样例输出:
-85070591730234615865843651857942052864
-85070591730234615865843651857942052864
要求:
- 使用字符数组来表示大数
- 实现加法运算,处理正负数
- 可解决的数字范围为:-2¹²⁷到 2¹²⁷-1
- 输出结果
提交方式:提交正确的可执行的代码和截图展示运行结果
Part 3 从表达式中提取操作数和操作符
在运算中,我们需要让程序自主从字符串表达式中提取操作数和操作符。为了更好地实现大数运算,我们需要编写一个程序,能够解析并提取表达式中的操作数和操作符,并判断操作数的正负。
任务:
编写代码从输入表达式中提取操作数和操作符
样例输入:
42535295865117307932921825928971026432 - (-42535295865117307932921825928971026432)
42535295865117307932921825928971026432 - (-42535295865117307932921825928971026432)
样例输出:
操作数1: 42535295865117307932921825928971026432
操作数2: -42535295865117307932921825928971026432
操作符: -
提交方式:提交正确的可执行的代码和截图展示运行结果
Part 4 封装大数四则运算
为了简化大数运算的实现,我们将封装加减乘除运算为函数
样例保证负数在括号内
注意:
所有操作数均可为大数,包括除法运算中的除数
样例输入1:
1180591620717411303424+(-590295810358705651712)
1180591620717411303424+(-590295810358705651712)
样例输出1:
590295810358705651712
590295810358705651712
样例输入2:
1180591620717411303424-590295810358705651712
1180591620717411303424-590295810358705651712
样例输出2:
590295810358705651712
590295810358705651712
样例输入3:
1180591620717411303424*1024
1180591620717411303424*1024
样例输出3:
1208925819614629174706176
1208925819614629174706176
样例输入4:
1208925819614629174706176/(-1180591620717411303424)
1208925819614629174706176/(-1180591620717411303424)
样例输出4:
-1024
-1024
任务:
- 实现加法、减法、乘法和除法的函数,处理正负数
- 在主函数中调用这些函数,并输出结果
提交方式:提交正确的可执行的代码和截图展示运行结果
需要掌握的知识点
- 字符数组的初始化、输入、输出和基本操作方法
- 掌握字符串的长度计算、字符转数字、数字转字符等基本操作,熟悉字符串的遍历和操作技巧
- 学会在程序中模拟进位和借位操作
- 符号位的概念
本题提交方式
主题示例:2024090101012-张三-CS-04
出题人联系方式
Js
QQ:3588856175