大整数的加法和乘法运算

C和C++中整数最大只能表示10位,不然就会溢出,所以出现了如何避免整数溢出的问题。其中一个方法就是使用字符串来表示,使用字符串的长度是没有限制的。


使用字符串表示整数然后进行乘法运算的关键有如下几点:

  1. 被乘数和乘数相乘时最开始不处理进位,而是每一位相乘的计算结果都是用整数来保存
  2. 第一步计算完毕之后从低位到高位开始处理进位
  3. 不难发现保存计算结果的整型数组的长度是被乘数的长度和乘数的长度之和
  4. 注意最高位的进位问题
  5. 将计算完毕后的整形数组转换成字符数组
  6. 字符数组尾端记得加上\0,整型转字符型时记得加上'0'

基本的算法步骤使用下面的图示来说明:(下面都是针对正整数的运算)





代码实现如下:

// Test9.cpp : 定义控制台应用程序的入口点。
//

#include <iostream>
#include <assert.h>
#include <sstream>
using namespace std;

void multiply(const char * str1,const char * str2)
{
	assert(str1!=NULL&
在C++中实现大整数加法乘法运算通常采用手动处理每一位的进位乘积,这个过程也称为“除以10取余”操作。由于这里不适合展示完整的流程图,我会简述一下步骤,并提供伪代码关键部分的代码。 ### 加法运算: 1. 初始化两个指针,分别指向两个大整数的首位。 2. 使用while循环,直到两个指针都达到尾部或其中一个为零: a. 对当前位做简单相加(如果超过9,则考虑进位)。 b. 将结果存入临时数组或变量。 c. 指针向后移动一位。 3. 如果有进位,将它加到临时数组的最高位。 4. 将临时数组转换回字符串形式作为结果。 **伪代码示例**: ```cpp String add(String num1, String num2) { // 省略处理长度、初始化等细节... int carry = 0; while (i < n1 || i < n2) { int sum = (num1[i] - '0') + (num2[i] - '0') + carry; result[i] = (sum % 10) + '0'; carry = sum / 10; i++; } if (carry > 0) { result.append(carry); } return result; } ``` ### 乘法运算: 1. 创建一个二维数组用于存储中间结果。 2. 双层for循环,遍历每一位乘以对应位的乘积并累加进目标数组。 3. 计算进位。 4. 最后将结果数组整理成字符串。 **伪代码示例**: ```cpp String multiply(String num1, String num2) { // 省略处理长度、初始化等细节... int mul[10][10], result[1000], carry = 0; for (int i = 0; i <= n1; i++) { for (int j = 0; j <= n2; j++) { mul[i][j] = (num1[i - 1] - '0') * (num2[j - 1] - '0'); } } for (int i = 0; i <= n1; i++) { for (int j = 0; j <= n2; j++) { result[i + j] += mul[i][j] + carry; carry = result[i + j] / 10; result[i + j] %= 10; } } // 省略添加前导零拼接字符串 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值