向量vector
洛谷原题 https://www.luogu.com.cn/problem/P1009
洛谷这道题目要求用高精度写阶乘,但是我还没有学过。从网上扒各种资料和网课,发现在学习高精度之前,需要知道vector这个容器。
什么是vector
vector是一个封装了动态大小数组的顺序容器,属于C++STL。可以简单认为。vector是一个能够存放任意类型的动态数组。
使用vector
使用vector需要在文件开头加上
#include< vector >
using namespace std;
原文链接:https://blog.csdn.net/qq_38654981/article/details/81907134
https://blog.csdn.net/w_linux/article/details/71600574
vector的初始化:
- vector<类型>标识符 //vector a
- vector<类型>标识符(最大容量) //vectora(10)
- vector<类型>标识符(最大容量,初始所有值) //vectora(10,1)
- int b[7]={1,2,3,4,5,9,8}; vector a(b,b+7); //从数组中获得初值
- vector< vector< int> >v; 二维向量 //这里最外的<>要有空格。否则在比较旧的编译器下无法通过
- vector a(b); //用b向量来创建a向量,整体复制性赋值
vector函数合集
https://blog.csdn.net/w_linux/article/details/71600574
高精度计算
学完vector后开始学习高精度计算
高精度计算实际上就是将大数据存储到字符串中,手动进行运算和重新储存。其原理大致相同,算法不同。
高精度加法
#include <iostream>
//<vector>自带一个size函数求长度
#include <vector>
using namespace std;
//数组长度+10防止边界问题
const int N=1e6+10;
//写一个方法返回vector类型
//这里取地址符是因为引用类型更快
//C=A+B
vector<int> add(vector<int> &A,vector<int> &B){
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];
//当前位只能储存数据t的个位数
C.push_back(t%10);
//让t整除10
t/=10;
}
//如果此时t仍然有数,则进1
if(t) C.push_back(1);
return C;
}
int main(){
//数字太长,用字符串读取
string a,b;
vector<int>A,B;
cin>>a>>b; //a="123456"
for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
//倒序存储//字符变整数减去'0'
for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
auto C = add(A,B);