一、高精度
当然在java中,进行高精度的加法、减法、乘法、除法运算的时候,可以通过java.math包中提供的BigInteger类提供的的方法来进行计算:
- 加法:a.add(b);表示a+b
- 减法:a.subtract(b);表示a-b
- 乘法:a.multiply(b);表示a*b
- 除法:a.divide(b);表示a/b并取整
- 取余:a.remainder(b);表示a%b
- 除法取余:BigInteger c[]=a.divideAndRemainder(b); a除b的商给 c[0],余数给c[1]
- 最大公约数:a.gcd(b); a与b的最大公约数
- 绝对值:a.abs(); 对a取绝对值
- 取相反数:a.negate(); 对a取相反数
- 取幂值:a.pow(n); 求a的n次方
二、高精度加法:
给定两个正整数,计算它们的和。
vector是stl里的动态数组,动态数组是模板库中的一个类,当元素的个数大于等于数组的大小的时候,数组的大小会变成原来的两倍,系统会从另一片区域中找出一块原来的数组的内存的两倍的空间,之后再把原来的数组拷贝到新的数组中。
为什么用a[i]-‘0’?因为ASCII中的0-9对应48-57,但我们计算的时候想要数字,而不是它的ASCII码。所以必须让0变为0,1变为1以此类推…
’0‘ - ’0‘ = 0 –> 48 - 48 = 0
‘1’ - ‘0’ = 1 –> 49 - 48 = 1
#include <iostream>
#include <vector>
using namespace std;
const int N=1e6+10;
vector<int> add(vector<int> &A,vector<int> &B)
{
vector<int> C;
int t=0;//设置进位,初始为0
for(int i=0;i<A.size() or i<B.size();i++)
{
if(i<A.size()) t+=A[i];
if(i<B.size()) t+=B[i];
//以上两步进行完后,t=上一轮加法的进位已经这一轮ab的和
C.push_back(t%10);
t/=10;
}
if(t) C.push_back(1); //最终t仍为1发生进位
return C;
}
int main()
{
string a,b;//a,b太大所以用字符串形式写入
vector<int> A,B;
cin>>a>>b;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0'); //将a[i]转换为int型,并从个位开始读入方便进位
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0'); //将b[i]转换为int型
auto C=add(A,B); //auto编译器自动判断类型
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
}
三、高精度减法
#include<iostream>
#include<vector>
using namespace std;
//判断A是否大于等于B
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
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);
if(t<0) t=1;
else t=0;
}
while(C.size()>1 and C.back()==0) C.pop_back();//去除前导0 (002 001)
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');
vector<int> C;
if(cmp(A,B))
{
//判断A是否大于B
auto C=sub(A,B);
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
}
else{
auto C=sub(B,A);
cout<<"-";
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
}
}
四、高精度乘法
#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() or t;i++)
{
if(i<A.size()) t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
while(C.size()>1 and C.back()==0) C.pop_back();//去除前置0
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--) cout<<C[i];
return 0;
}
五、高精度除法
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//A/b,商是c余数是r
vector<int> div(vector<int> &A,int b,int &r)
{
vector<int> C;
r=0;
for(int i=A.size()-1;i>=0;i--)
{
r=r*10+A[i];
C.push_back(r/b);
r%=b;
}
reverse(C.begin(),C.end());
while(C.size()>1 and 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');
int r;
auto C=div(A,b,r);
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
cout<<endl;
cout<<r<<endl;
return 0;
}