基础算法-高精度算法

AcWing 791.高精度加法

给定两个正整数(不含前导 00),计算它们的和。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的和。

数据范围

1≤整数长度≤1000001≤整数长度≤100000

输入样例:
12
23
输出样例:
35
#include <iostream>
#include <vector>
//利用vector定义数组,利用<vector>库中的size函数获取长度
using namespace std;
//定义一个vector<int>类型的add函数用于运算结果
//C = A + B
vector<int> add(vector<int> &A, vector<int> &B)//添加引用&A,&B提高效率,不会复制整个数组
{
    if (A.size() < B.size()) return add(B, A);

    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size() ||i < B.size(); i ++ )
    {
        if (i < A.size()) t += A[i];
        if (i < B.size()) t += B[i];
//每一次的结果都可以看成A[i] + B[i] + t
//c保留当前的余数,成为每位运算的保留结果
        C.push_back(t % 10);
//t取整,代表向前进位
        t /= 10;
//再次循环,将进位的t再次带入运算
    }
//判断最高位的t是否进位
    if (t) C.push_back(t);
    return C;
}

int main()
{
    string a, b;//定义两个字符串,存放数据
    vector<int> A, B;//定义两个int 类型的的vector数组
    cin >> a >> b;//接受数据 a = "123456"
    for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
//A =[6,5,4,3,2,1]
//逆序,从前往后遍历每一个字符串a[i]
//利用vector库中的push_back函数将元素加入到数组A[],B[]的尾部
    for (int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');

    auto C = add(A, B);//auto自动将C的类型转换

    for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
    cout << endl;
//将逆序的数组进行再次逆序输出,得到正确结果
    return 0;
}

思路:

区分 位数和数的大小

A+B的位数大概在10的6次方

A-B的位数大概在10的6次方

A*a的位数大概在10的6次方;其中a为常数小于10的9次方

A/a求商和余数;其中a为常数小于10的9次方

大整数的存储

1:存进数组当中,如:123456789,存入数组,其为987654321,其中9为位置0

原因:数组的开头修改较为麻烦,我们逆序存储,可以运算时pushback进行进位

2:运算,模拟人工加法

注意:vector<int>A

vector 详解(C++)

C++ STL中的verctor好比是C语言中的数组,但是vector又具有数组没有的一些高级功能。与数组相比,vector就是一个可以不用再初始化就必须制定大小的边长数组,当然了,它还有许多高级功能。

1.头文件

#include <vector>

2.初始化

如果vector的元素类型是int,默认初始化为0;如果vector元素类型为string,则默认初始化为空字符串。

vector<int> v1;

vector<father> v2;

vector<string> v3;

vector<vector<int> >; //注意空格。这里相当于二维数组int a[n][n];

vector<int> v5 = { 1,2,3,4,5 }; //列表初始化,注意使用的是花括号

vector<string> v6 = { "hi","my","name","is","lee" };

vector<int> v7(5, -1); //初始化为-1,-1,-1,-1,-1。第一个参数是数目,第二个参数是要初始化的值

vector<string> v8(3, "hi");

vector<int> v9(10); //默认初始化为0

vector<int> v10(4); //默认初始化为空字符串

3.添加元素

请使用push_back加入元素,并且这个元素是被加在数组尾部的。

for (int i = 0; i < 20; i++)

{

v1.push_back(i);

}

4.访问vector中的元素

for (int i = 0; i < v1.size(); i++)

{

cout << v1[i] << endl;

v1[i] = 100;

cout << v1[i] << endl;

}

注意:只能对已存在的元素进行赋值或者修改操作,如果是要加入新元素,务必使用push_back。push_back的作用有两个:告诉编译器为新元素开辟空间、将新元素存入新空间里。

比如下面的代码是错误的,但是编译器不会报错,就像是数组越界。

vector<int> vec;

vec[0] = 1; //错误!

当然我们也可以选择使用迭代器来访问元素

vector<string> v6 = { "hi","my","name","is","lee" };

for (vector<string>::iterator iter = v6.begin(); iter != v6.end(); iter++)

{

cout << *iter << endl;

//下面两种方法都都可以检查迭代器是否为空

cout << (*iter).empty() << endl;

cout << iter->empty() << endl;

}

上面是正向迭代,如果我们想从后往前迭代该如何操作?

使用反向迭代器

for (vector<string>::reverse_iterator iter = v6.rbegin(); iter != v6.rend(); iter++)

{

cout << *iter << endl;

}

5.插入元素

下面的例子,演示了如何使用 insert() 函数向 vector 容器中插入元素。

#include <iostream>

#include <vector>

#include <array>

using namespace std;

int main()

{

std::vector<int> demo{1,2};

//第一种格式用法

demo.insert(demo.begin() + 1, 3);//{1,3,2}

//第二种格式用法

demo.insert(demo.end(), 2, 5);//{1,3,2,5,5}

//第三种格式用法

std::array<int,3>test{ 7,8,9 };

demo.insert(demo.end(), test.begin(), test.end());//{1,3,2,5,5,7,8,9}

//第四种格式用法

demo.insert(demo.end(), { 10,11 });//{1,3,2,5,5,7,8,9,10,11}

for (int i = 0; i < demo.size(); i++) {

cout << demo[i] << " ";

}

return 0;

}

6.删除元素

前面提到,无论是向现有 vector 容器中访问元素、添加元素还是插入元素,都只能借助 vector 模板类提供的成员函数,但删除 vector 容器的元素例外,完成此操作除了可以借助本身提供的成员函数,还可以借助一些全局函数。

基于不同场景的需要,删除 vecotr 容器的元素,可以使用下表 中所示的函数(或者函数组合)。

pop_back() 成员函数的用法非常简单,它不需要传入任何的参数,也没有返回值。举个例子:

#include <vector>

#include <iostream>

using namespace std;

int main()

{

vector<int>demo{ 1,2,3,4,5 };

demo.pop_back();

//输出 dmeo 容器新的size

cout << "size is :" << demo.size() << endl;

//输出 demo 容器新的容量

cout << "capacity is :" << demo.capacity() << endl;

for (int i = 0; i < demo.size(); i++) {

cout << demo[i] << " ";

}

return 0;

}

运行结果为:

size is :4

capacity is :5

1 2 3 4

可以发现,相比原 demo 容器,新的 demo 容器删除了最后一个元素 5,容器的大小减了 1,但容量没变。

如果想删除 vector 容器中指定位置处的元素,可以使用 erase() 成员函数,该函数的语法格式为:

iterator erase (pos);

其中,pos 为指定被删除元素位置的迭代器,同时该函数会返回一个指向删除元素所在位置下一个位置的迭代器。

下面的例子演示了 erase() 函数的具体用法:

#include <vector>

#include <iostream>

using namespace std;

int main()

{

vector<int>demo{ 1,2,3,4,5 };

auto iter = demo.erase(demo.begin() + 1);//删除元素 2

//输出 dmeo 容器新的size

cout << "size is :" << demo.size() << endl;

//输出 demo 容器新的容量

cout << "capacity is :" << demo.capacity() << endl;

for (int i = 0; i < demo.size(); i++) {

cout << demo[i] << " ";

}

//iter迭代器指向元素 3

cout << endl << *iter << endl;

return 0;

}

运行结果为:

size is :4

capacity is :5

1 3 4 5

3

通过结果不能看出,erase() 函数在删除元素时,会将删除位置后续的元素陆续前移,并将容器的大小减 1。

利用、、//vectorbiaoshibiao表示大整数,可他又以利用size函数臂傲视表示数组长度//dingyi定义了vector<>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值