高精度加法
#include<iostream>
#include<vector>
using namespace std;
const int maxn=1e6+10;
//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];
C.push_back(t%10);
t/=10;
}
if(t)C.push_back(t);
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');//A=[6,5,4,3,2,1]
for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
auto C=add(A,B);
for(int i=C.size()-1;i>=0;i--)
{
cout<<C[i];
}
return 0;
}
#include <iostream>
#include<vector>
using namespace std;
const int maxn=1e6+10;
int a[maxn];
vector<int> add(vector<int>&A,vector<int>&B)
{
vector<int>c;
if(A.size()<B.size())return add(B,A);
int t=0;
for(int i=0;i<A.size();i++)
{
t+=A[i];
if(i<B.size())t+=B[i];
c.push_back(t%10);
t/=10;
}
if(t)c.push_back(t);
return c;
}
int main() {
string a,b;
vector<int>A,B;
cin>>a>>b;
for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
auto c=add(A,B);
for(int i=c.size()-1;i>=0;i--)printf("%d",c[i]);
return 0;
}
高精度减法
#include<iostream>
#include<vector>
using namespace std;
const int maxn=1e6+10;
bool cmp(vector<int>&A,vector<int>&B)
{
if(A.size()!=B.size())return A.size()>B.size();
for(int i=A.size()-1;i>=0;i--)
{
if(A[i]!=B[i])return A[i]>B[i];
}
return true;//两个数相等
}
// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
vector<int> C;
for (int i = 0, t = 0; i < A.size(); i ++ )
{
t = A[i] - t;
if (i < B.size()) t -= B[i];
C.push_back((t + 10) % 10);//push_back(x)就是在vector后面添加一个元素x
if (t < 0) t = 1;
else t = 0;
}
//pop_back()用来删除vector的尾元素
//back()可以获得尾部元素
while (C.size()>1&&C.back()==0)C.pop_back();//去掉0
return C;
}
int main()
{
string a,b;
/*
例如 输入字符串a=1234;则a[0]=1,a[1]=2,a[2]=3,a[3]=4
*/
vector<int>A,B;
//push_back(x)就是在vector后面添加一个元素x
/*
例如:输入字符串a=1234,执行for语句时A[0]=4,A[1]=3;A[2]=1,A[3]=0;
*/
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]
for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
if(cmp(A,B))
{
auto C=sub(A,B);
for(int i=C.size()-1;i>=0;i--)
{
cout<<C[i];
}
}
else{
cout<<"-";
auto C=sub(B,A);
for(int i=C.size()-1;i>=0;i--)
{
cout<<C[i];
}
}
return 0;
}
高精度乘法
#include<iostream>
#include<vector>
using namespace std;
vector<int>mul(vector<int>&a,int b)
{
vector<int>c;
int t=0;
for(int i=0;i<a.size();i++)
{
t+=a[i]*b;
c.push_back(t%10);//push_back(x)就是在vector后面添加一个元素x
t/=10;
}
//pop_back()用来删除vector的尾元素
//back()可以获得尾部元素
c.push_back(t);
while(c.size()>1&&c.back()==0)c.pop_back();//去掉0
return c;
}
int main()
{
string a;
/*
例如 输入字符串a=1234;则a[0]=1,a[1]=2,a[2]=3,a[3]=4
*/
int b;
cin>>a>>b;//a=123456
vector<int>A;
//push_back(x)就是在vector后面添加一个元素x
/*
例如:输入字符串a=1234,执行for语句时A[0]=4,A[1]=3;A[2]=1,A[3]=0;
*/
for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');//A=[6,5,4,3,2,1]
auto C=mul(A,b);
for(int i=C.size()-1;i>=0;i--)cout<<C[i];
return 0;
}
高精度除法
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//A/b 商是C,余数是r
vector<int> div(vector<int> &A,int b,int &r)
{ //&r代表传入r的地址,便于直接对余数r进行修改
vector<int> C;
//push_back(x)就是在vector后面添加一个元素x
for(int i=0;i<A.size();i++)
{ //对A从最高位开始处理
r=r*10+A[i];//将上次的余数*10在加上当前位的数字,便是该位需要除的被除数
C.push_back(r/b);//所得即为商在这一位的数字
r=r%b;
}
/*由于在除法运算中,高位到低位运算,
因此C的前导零都在vector的前面而不是尾部,vector只有删除最后一个数字pop_back是常数复杂度,
而对于删除第一位没有相应的库函数可以使用,而且删除第一位,其余位也要前移,*/
//因此我们将C翻转,这样0就位于数组尾部,可以使用pop函数删除前导0
reverse(C.begin(),C.end());
//pop_back()用来删除vector的尾元素
//back()可以获得尾部元素
while(C.size()>1&&C.back()==0) C.pop_back();//去掉0
return C;
}
int main()
{
string a;//a是被除数
/*
例如 输入字符串a=1234;则a[0]=1,a[1]=2,a[2]=3,a[3]=4
*/
int b,r=0;//b是除数,r为余数
cin>>a>>b;//a=123456
vector<int>A;
//A是由高为传输至低位,由于在除法的手算过程中,发现从高位进行处理
//push_back(x)就是在vector后面添加一个元素x
/*
例如:输入字符串a=1234,执行for语句时A[0]=4,A[1]=3;A[2]=1,A[3]=0;
*/
for(int i=0;i<a.size();i++) A.push_back(a[i]-'0');
auto C=div(A,b,r);
for(int i=C.size()-1;i>=0;i--)cout<<C[i];
cout<<endl<<r;
return 0;
}