声明
这篇文章的代码仅仅只是一个模板。
高精度加法
思想:和两数的加法类似(从小数位加加到大数位,),
一个数在数组里是倒着放,方便加法
性质:方便放
代码实现:
#include<iostream>
#include<string>
#include <vector>
using namespace std;
vector<int> add(vector<int>&A,vector<int>&B)
{
vector<int> ret;
int j=0;//进位
int n=A.size();
int m=B.size();
for (int i = 0; i < n||i<m; i ++ )
{
if(i<n) j+=A[i];
if(i<m) j+=B[i];
ret.push_back(j%10);
j/=10;
}
if(j) ret.push_back(j); //如果两个数的最高位加起来大于10 则要放入进制位,
return ret;
}
int main()
{
string a,b;
cin>>a,cin>>b;
vector<int>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);//auto 为c++11的语法,也可以写成vector<int> C=add(A,B);
for(int i=C.size()-1;i>=0;i--)
printf("%d",C[i]);//逆序输出,得到两个大树的答案
return 0;
}
高精度减法
和加法类似,只是需要注意前导0。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
bool cmp(vector<int>& A,vector<int>& B)
{
int n=A.size();
int m=B.size();
if(n!=m) return n>m;
for(int i=n-1;i>=0;i--)
{
if(A[i]!=B[i]) return A[i]>B[i];
}
return true;
}
vector<int> sub(vector<int>& A,vector<int>& B)
{
//由于前面进行了比较,所以这里A的值固定比B的大
vector<int> ret;
int n=A.size();
for (int i = 0,t=0; i < n; i ++ )
{
t=A[i]-t;
if(i<B.size()) t-=B[i];
ret.push_back((t+10)%10);
if(t<0) t=1;
else t=0;
}
while(ret.size()>1&&ret.back()==0) ret.pop_back();
//删除前导0,两个数A和B的位数,且最高位数字一样,则会产生前导0;要删除掉
return ret;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int> 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');
if(cmp(A,B)){ //比较A和B的大小
auto C=sub(A,B);
for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
}
else
{
auto C=sub(B,A);
printf("-");
for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
}
return 0;
}
高精度乘法
高精乘低精度
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> mul(vector<int>& A,int b)
{
vector<int> C;
int t=0;
int n=A.size();
for (int i = 0; i < n||t; i ++ )
{
if(i<n) t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main()
{
string a;
int b;
cin>>a>>b;
vector<int> A;
for(int i=a.size()-1;i>=0;i--) {
A.push_back(a[i]-'0');
}
auto C=mul(A,b);
for (int i = C.size()-1; i >=0 ; i -- ) printf("%d",C[i]);
return 0;
}
高精乘高精
两个数组倒着,和高精*低精类似 ,自己接两个数组的每个数先相乘后的值放到ret数组对应的位置里,先不管进制,后面在进行O(N)的处理进制,
//高精*高精
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> mul(vector<int>& A, vector<int>& B)
{
vector<int> ret(A.size()+B.size());
for (int i = 0; i < A.size() ; i++)
for (int j = 0; j < B.size(); j++)
ret[i + j] = A[i] * B[j];
int t = 0;
for (int i = 0; i < ret.size() - 1; i++)
{
t += ret[i];
ret[i] = t % 10;
t /= 10;
}
while (ret.size() > 1 && ret.back() == 0) ret.pop_back(); //删除前导0
return ret;
}
int main()
{
string a, b;
cin >> a >> b;
vector<int> 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 = mul(A, B);
for (int i = C.size() - 1; i >= 0; i--)
{
printf("%d", C[i]);
}
return 0;
}
高精度除法
高精度/低精度
注意这次的A是由高为传输至低位,由于在除法的手算过程中,发现从高位进行处理,
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
vector<int> mul(vector<int>& A, int b)
{
vector<int> ret;
int r = 0;//r表示余数
//由最高位进行处理
for (int i = 0; i < A.size(); i++)
{
//将上次的余数*10在加上当前位的数字,便是该位需要除的被除数
r = r * 10 + A[i];
//所得即为商在这一位的数字
ret.push_back(r / b);
r %= b;
}
//删除前面的0
reverse(ret.begin(), ret.end());
while (ret.size() > 1 && ret.back() == 0) ret.pop_back();
return ret;
}
int main()
{
string a;
int b;
cin >> a >> b;
vector<int> A;
for (int i = 0; i < a.size(); i++) A.push_back(a[i]-'0');
auto C = mul(A, b);
for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
return 0;
}
高精/高精
参考此链接参考此链接