首页 > 编程语言 >大整数相加[C++]

大整数相加[C++]

时间:2024-11-09 09:10:05浏览次数:3  
标签:arr num1 num2 int 相加 整数 length C++ string

0 前言

当我们遇到需要处理非常大的整数的情况时,标准的数据类型如int或long long int可能无法满足需求,因为这些类型的数值范围有限。在这种情况下,我们需要一种方法来处理超出常规数据类型范围的大整数。本文将介绍如何使用C++实现大整数相加。

1 大整数相加的基本原理

从最低位开始逐位相加,并处理进位。由于C++的标准数据类型不足以存储非常大的数,我们可以使用字符串来存储这些大整数。每个字符代表一个数字,通过遍历字符串中的每一位来进行加法运算。

2 实现步骤

2.1 输入处理:

为了方便计算,将这两个字符串反转,较长的在上方,较短的在下方,使得个位对齐,较短的数值高位使用0补充。如下图所示。
image

2.2 加法运算

  1. 初始化一个变量用于保存进位值,例如变量carry。
  2. 从最低位开始,同时遍历两个字符串的每一位,计算当前位的和加上进位值。
  3. 如果当前位的和大于等于10,则设置进位值为1,否则为0。
  4. 当前位的结果为和模10的值。

算法过程如下图所示。
image

3 代码

点击查看代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

// 大整数相加函数
string add(string num1, string num2)
{
    //保存计算信息及结果
    vector<vector<char>> arr(3, vector<char>(max(num1.length(), num2.length()), '0'));
    //较长的串在上方,默认s1串在上方,s2在下方,最底行保存计算结果。
    string s1 = num1.length() > num2.length() ? num1 : num2;
    string s2 = num1.length() < num2.length() ? num1 : num2;
    //反序后填入到arr中
    reverse(s1.begin(), s1.end());
    for (int a = 0; a < s1.length(); ++a)
    {
        arr[0][a] = s1.at(a);
    }
    reverse(s2.begin(), s2.end());
    for (int a = 0; a < s2.length(); ++a)
    {
        arr[1][a] = s2.at(a);
    }
    //进位值
    int carry = 0;
    //从左往右依次计算
    for (int a = 0; a <= arr.front().size()-1; ++a)
    {
        arr[0][a] += carry;//第一个值加上进位值
        carry = 0;
        short v1 = arr[0][a] - '0';
        short v2 = arr[1][a] - '0';
        if (v1 + v2 >= 10)//需要设置进位
        {
            carry = (v1 + v2) / 10;//相加结果>=10,需要设置进位
            arr[2][a] = ((v1 + v2) % 10) + '0';//计算结果为取模10
        }
        else//不需要设置进位
        {
            arr[2][a] = (v1 + v2) + '0';
        }
    }
    //反序
    string res("");
    for (int a = arr.front().size() - 1; a >= 0; --a)
    {
        res = res.append(1, arr[2][a]);
    }
    return res;
}

int main()
{
    //相乘的两个整数
    string num1 = "123456";
    string num2 = "8762";
    string ret = add(num1, num2);
    cout << "两个整数和: " << ret << endl;
    return 0;
}
点击查看运行结果
两个整数乘积为: 132182

D:\Visual Studio 2019\项目\大整数加法\x64\Debug\大整数加法.exe (进程 12336)已退出,代码为 0。
按任意键关闭此窗口. . .

标签:arr,num1,num2,int,相加,整数,length,C++,string
From: https://www.cnblogs.com/hello-nullptr/p/18536106

相关文章

  • C++函数名后面有个const
    ‌函数名后面加const表示该函数是一个常成员函数,即该函数不会修改类的任何成员变量。‌在C++中,常成员函数通过在函数声明和定义后添加const关键字来标识。常成员函数不能修改类的任何成员变量,这保证了类的接口的稳定性。例如: classPoint{public:intGetX()const;//......
  • C++中的继承
    在C++中,继承的方式有三种:public、protected 和 private。它们控制了基类成员在派生类中的访问权限。以下是这三种继承方式的区别:1. public 继承基类的 public 成员在派生类中保持 public。基类的 protected 成员在派生类中保持 protected。基类的 private 成员......
  • c语言中返回整数值的长度
     001、方法1while循环[root@PC1test]#lstest.c[root@PC1test]#cattest.c##测试c程序#include<stdio.h>intget_length(inta){intlength=0;while(a>0){length++;a/=10;......
  • C++中的std::shared_ptr
    std::shared_ptr 是C++11标准库中的智能指针类型,用于管理动态分配的对象。与传统指针不同,std::shared_ptr 自动管理内存,并在不再使用时自动释放对象,以避免内存泄漏。它是一种共享所有权的智能指针,即可以让多个 std::shared_ptr 指向同一个对象,并且会记录有多少个 std::shar......
  • C++中类型转换static_cast
    static_cast<type> 是C++中的一种类型转换方式,用于在编译期进行静态类型转换。与C风格的强制类型转换不同,static_cast 更加安全和明确,因为它只允许特定的类型转换,避免了潜在的错误和歧义。static_cast 的用法static_cast<type>(expression) 将 expression 转换为 typ......
  • c++--拷贝构造函数&友元函数
    目录1.拷贝构造函数是什么2.拷贝构造函数的基本格式2.1默认拷贝构造函数(浅拷贝)2.2深拷贝(DeepCopy)2.3浅拷贝(ShallowCopy)2.3浅拷贝和深拷贝总结2.友元函数1.拷贝构造函数是什么拷贝构造函数是一个特殊的构造函数,用于在创建新对象时,用已有对象的数据来初始......
  • 每日OJ题_牛客_BC157素数回文_数学_C++_Java
    目录牛客_BC157素数回文_数学题目解析C++代码Java代码牛客_BC157素数回文_数学素数回文_牛客题霸_牛客网描述:现在给出一个素数,这个素数满足两点:1、  只由1-9组成,并且每个数只出现一次,如13,23,1289。2、  位数从高到低为递减或递增,如2459,87631。请你判断一下,这......
  • C++之setw
    1.什么是setwsetw是C++中一个用于控制输出宽度的操纵符(manipulator),它定义在<iomanip>头文件中。通过setw可以指定下一个输出项应占用的字符宽度,在格式化输出时非常有用。2.setw的作用setw(n)设置的宽度n表示下一个要输出的项所占的最小宽度。如果输出项的实际字......
  • C++之endl以及它与换行符的区别
    看下C++_primer上的一段话,并给予解释:1.endl是操纵符在C++中,endl是一种特殊的操纵符(manipulator),它的作用不仅是结束一行(相当于换行),还会刷新缓冲区。操纵符是一种可以影响输出行为的特殊值,比如endl、setw等。题外话想要了解更多关于setw的内容,可以看下这篇博客C++之set......
  • C++中类和结构体的互相继承
    在C++中,struct可以继承类,反之,类也可以继承struct。struct和类的唯一区别在于访问级别,默认情况下,struct的成员是public,而类的成员是private。以下是一个简单的例子:classBaseClass{public:voidBaseFunction(){std::cout<<"FunctioninBaseClass"<<std::endl;......