高精度加法
题目链接:高精度加法
#include <iostream>
#include <vector>
#include <string>
using namespace std;
const int N=1e5+10;
vector<int> add(vector<int> &a, vector<int> &b)
{
if(a.size()<b.size()) return add(b,a);//省去结束函数前的去除前导0操作
vector<int> c;
int carry=0;
for(int i=0;i<a.size();i++)//正向
{
if(i<b.size()) carry+=(a[i]+b[i]);
else carry+=a[i];
c.push_back(carry%10);
carry/=10;
}
if(carry!=0) c.push_back(carry);//有进位记得加上
return c;
}
int main()
{
vector<int> a;
vector<int> b;
//用string读入
string 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');
vector<int> c = add(a,b);
for(int i=c.size()-1;i>=0;i--) cout<<c[i];
return 0;
}
高精度减法
题目链接:高精度减法
#include <iostream>
#include <vector>
#include <string>
using namespace std;
const int N=1e5+10;
bool cmp(vector<int> &a, vector<int> &b)//判a b大小
{
if(a.size()>b.size()) return true;
else if(a.size()<b.size()) return false;
else
{
for(int i=a.size()-1;i>=0;i--)
{
if(a[i]>b[i]) return true;
else if(a[i]<b[i]) return false;
}
}
return true;
}
vector<int> sub(vector<int> &a, vector<int> &b)
{
if(!cmp(a,b)) return sub(b,a);//大减小,不可能出现负数
vector<int> c;
int borrow = 0;//记录结果和借位
for(int i=0;i<a.size();i++)//正向
{
if(i<b.size()) borrow=(a[i]-b[i]-borrow);
else borrow=a[i]-borrow;
c.push_back((borrow+10)%10);//此时将borrow的大小与0两种情况合并写
if(borrow>=0) borrow=0;
else borrow=1;//小于0借位
}
while(c.size()>1 && c.back()==0)
{
c.pop_back();//可能出现两大数相等,去前导0
}
return c;
}
int main()
{
vector<int> a;
vector<int> b;
//用string读入
string 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');
vector<int> c = sub(a,b);
if(cmp(a,b)) for(int i=c.size()-1;i>=0;i--) cout<<c[i];
else
{
cout<<"-";//如果是小数减大数要加负号
for(int i=c.size()-1;i>=0;i--) cout<<c[i];
}
return 0;
}
高精度乘低精度
题目链接:高精度乘低精度
#include <iostream>
#include <vector>
#include <string>
using namespace std;
const int N=1e5+10;
vector<int> mul(vector<int> &a, int b)
{
vector<int> c;
int carry=0;
for(int i=0;i<a.size();i++)//正向
{
if(i<a.size())carry+=(a[i]*b);
c.push_back(carry%10);
carry/=10;
}
if(carry!=0) c.push_back(carry);//有进位记得加上
while(c.size()>1 && c.back()==0) c.pop_back();//去前导0
return c;
}
int main()
{
vector<int> a;
int b;
//用string读入
string A;
cin>>A>>b;
for(int i=A.size()-1;i>=0;i--) a.push_back(A[i]-'0');//注意是从个位开始压入,逆向
vector<int> c = mul(a,b);
for(int i=c.size()-1;i>=0;i--) cout<<c[i];
return 0;
}
高精度除低精度
题目链接:高精度除低精度
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
const int N=1e5+10;
vector<int> div(vector<int> &a, int b, int &remainder)
{
vector<int> c;
for(int i=a.size()-1;i>=0;i--)//注意是逆向(从最高位开始除)
{
if(i<a.size()) remainder=(remainder*10+a[i]);
c.push_back(remainder/b);
remainder%=b;
}
reverse(c.begin(),c.end());//注意逆置
while(c.size()>1 && c.back()==0) c.pop_back();//去前导0
return c;
}
int main()
{
vector<int> a;
int b;
int remainder=0;
//用string读入
string A;
cin>>A>>b;
for(int i=A.size()-1;i>=0;i--) a.push_back(A[i]-'0');//注意是从个位开始压入,逆向
vector<int> c = div(a,b,remainder);
for(int i=c.size()-1;i>=0;i--) cout<<c[i];
cout<<endl<<remainder<<endl;
return 0;
}