高精度整体思路
由于,我们可能遇到长度会爆掉 long long 类型的运算,为了解决这种情况,我们首先将AB两数分别逆序(便于从低位到高位运算)存入到字符串s1,s2中,接着根据不同运算的特点的进行相应计算(下文会一一说明),切记解决前导为0情况(我今天忘记这个,wa了好几次,难过了`(*>﹏<*)′....)
1.高精度加法 (A+B=C)
输入:
将两个加数逆序存入s1,s2中。
cin>>s1>>s2;
for(int i=s1.size()-1;i>=0;i--) A.push_back(s1[i]-'0');
for(int i=s2.size()-1;i>=0;i--) B.push_back(s2[i]-'0');
进行运算:
首先用t暂存当前位数A,B之和,C在次位为(t%10),如果A+B大于10时,t=t/10可以暂存进位数,运算最后一位时,根据t判断最高位数。
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=t/10;
}
if(t) C.push_back(t);//判断最高位
生成代码:
#include <iostream>
#include<vector>
#include<string>
using namespace std;
vector<int>A,B,C;
string s1,s2;
void add(){
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=t/10;
}
if(t) C.push_back(t);//判断最高位
}
int main(){
cin>>s1>>s2;
for(int i=s1.size()-1;i>=0;i--) A.push_back(s1[i]-'0');
for(int i=s2.size()-1;i>=0;i--) B.push_back(s2[i]-'0');
add();
int len=C.size()-1;//数据储存在[0,C.size()-1]区间内
while(C[len]==0&&len)//去除前导0
len--;
for(int i=len;i>=0;i--) cout<<C[i];
cout<<'\n';
return 0;
}
2.高精度减法(A-B=C)
#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;
}
vector<int> sub(vector<int> A, vector<int> B)
{
vector<int> C;
int t = 0; // 表示借位
for(int i=0; i<A.size(); i++) // 这里是个位相减,从0开始遍历
{
t = A[i] - t; // t表示借位
if(i < B.size()) t -=B[i]; // 表示如果B的第i位有数时,相减
C.push_back((t + 10) % 10);
if(t < 0) t = 1; // t<0 表示需要借位,赋值t=1,让下一位相减时,多减一个1
else
t = 0;
}
// 去掉前导0
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main()
{
string s1, s2;
cin >> s1 >>s2;
vector<int> A, B;
for(int i=s1.size()-1; i>=0; i--) A.push_back(s1[i] - '0');
for(int i=s2.size()-1; i>=0; i--) B.push_back(s2[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;
}
3.高精度阶乘
#include<iostream>
#include<vector>
using namespace std;
vector<int>fact(vector<int>&a, int b)
{
vector<int>c;
int t = 0;//存储
for(int i = 0; i < a.size() || t; i++)
{
//当前位数有数时,t储存进位数与a[i]*b之和
if(i < a.size() ) t += a[i] * b;
c.push_back(t % 10);
t /= 10;//去一位
}
//去除前导0
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}//阶乘
int main() {
int n;
vector<int>a;
cin >> n;
if(n==0)//特判n=0时情况
{
cout<<"0\n";
return 0;
}
a.push_back(1);//存入首位1
for(int i = 1; i <= n; i++)
{
a = fact(a, i);
}
for(int i = a.size() - 1; i >= 0; i--) cout << a[i];
cout << endl;
return 0;
}