高精度:解决上百位数的计算
< vector>的一些简单 用法
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
vector<int> v(5,1);//表示v里面含有5个元素且全为1 ;
vector<int> a;
for(int i=0;i<5;i++)
{
a.push_back(i);//把i的值当作a中最后一位元素的值;
}
cout<<a.front()<<" ";//返回a中第一个元素的值
cout<<a.back();//返回a中最后一个元素的值
a.clear();//将a中所有元素清空
cout<<a.empty()//判断a中是否含有元素 没有返回true否则false
return 0;
}
高精度加法代码
//高精度
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> add(vector<int> &A,vector<int> &B)//使用引用变量
{
vector<int> C;
if(A.size()<B.size()) return add(B,A);//让A的长度大于B的长度
int t=0;
for(int i=0;i<A.size();i++)
{
t+=A[i];
if(i<B.size())t+=B[i];//让A与B的值加一起
C.push_back(t%10);//进位
t/=10;
}
if(t)C.push_back(1);//如果t不为o说明t/=10之后还有进位
return C;
}
int main()
{
string a,b;
vector<int> A,B;//储存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];
}
利用高精度解决较大的斐波那契数列
Q:楼梯有 NN 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
A:(利用二维数组来实现高精度的思路)
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 5010;
int f[N][N],n,len=1;
void fb(int n)
{
for(int i=1;i<=len;i++)
f[n][i]=f[n-1][i]+f[n-2][i];
for(int i=1;i<=len;i++)
{
if(f[n][i]>=10)
{
f[n][i+1]+=f[n][i]/10;
f[n][i]=f[n][i]%10;
if(f[n][len+1]!=0)len++;
}
}
}
int main()
{
cin>>n;
f[1][1]=1;
f[2][1]=2;
for(int i=3;i<=n;i++)
fb(i);
for(int i=len;i>=1;i--)
{
cout<<f[n][i];
}
return 0;
}
高精度减法(两正整数相减)
```cpp
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool cmp(vector<int> &A,vector<int> &B)
{
if(A.size()!=B.size())return A.size()>B.size();//如果A,B的长度不相等返回判断A是否比B长
for(int i=A.size()-1;i>=0;i--)//如果长度相等从最高位开始比较
{
if(A[i]!=B[i])// 如果不等 返回判断A[i]是否大于B[i]
return A[i]>B[i];
}
return true;//此时说明A,B是相等的
}
vector<int> sup(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=t-B[i];//判断i是否大于B的长度
C.push_back((t+10)%10);
/*此时应该分两种情况
1.如果t<0,说明A[i]小于b[i],应该借位 C[i]应该等于A[i]+10-B[i];
2.如果t>=0,说明A[i]大于b[i],(t+10)%10==t;
综上所述 无论 那种情况都可以有t+10)%10;
*/
if(t<0)//t<0,接下来要借位
t=1;
else
t=0;
}
while(C.size()>1&&C.back()==0) C.pop_back();//去掉前导0,如123-120会有003;
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');
if(cmp(A,B))//判断A和B的大小,那大的减去小的,如果换位则多输出一个负号
{
vector<int> C = sup(A,B);
for(int i=C.size()-1;i>=0;i--)cout<<C[i];
}
else
{
vector<int> C=sup(B,A);
cout<<"-";
for(int i=C.size()-1;i>=0;i--)cout<<C[i];
}
return 0;
}
```
高精度乘法
#include
#include
#include
using namespace std;
//高精度乘法模板
那一个很大的数(上百位)的数与一个较小的数相乘
vector<int> mul(vector<int> &A,int b)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size()||t;i++)//类似与高精度的加法 二者可以相互印证
{
if(i<A.size())t+=A[i]*b;
C.push_back(t%10);
t=t/10;
}
while(C.size()>1&&C.back()==0)C.pop_back();//去掉后导0
return C;
}
int main()
{
string a;
vector<int> A;
int b;
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<algorithm>
#include<vector>
using namespace std;
vector<int> div(vector<int> &A,int b,int &r)//r用引用变量来使用
{
vector<int> C;
for(int i=A.size()-1;i>=0;i--)//算法核心
{
r=r*10+A[i];
C.push_back(r/b);
r=r%b;
}
reverse(C.begin(),C.end());//将字符串逆序
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main()
{
string a;
int b,r;
vector<int> 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,r);
for(int i=C.size()-1;i>=0;i--)cout<<C[i];
cout<<endl<<r<<endl;
return 0;
}