高精度
高精度,即无法使用 C++ 本身配置的数据类型中使用的运算
高精度加法
主要方法:
- 使用字符串存储数字
- 转换为整型数组
- 模拟竖式加法
- 逆序输出
Code
#include <iostream>
using namespace std;
#define MAXN 10005
string s1,s2;
int a[MAXN],b[MAXN],c[MAXN];
int main()
{
cin>>s1>>s2; //输入
int len1=s1.size(),len2=s2.size(); //两者的长度
int len=max(len1,len2); //两者较长的长度
for(int i=0;i<len1;i++) a[i]=s1[len1-1-i]-48; //逆序存储a(s1)
for(int i=0;i<len2;i++) b[i]=s2[len2-1-i]-48; //逆序存储b(s2)
int xx=0,i;
for(i=0;i<len;i++)
{
c[i]=a[i]+b[i]+xx; //相加
xx=c[i]/10; //处理进位
c[i]%=10;
}
c[i]=xx; //处理最高位又进一位的情况
while(c[i]==0&&i>0) i--; //删除前导0
for(;i>=0;i--) cout<<c[i]; //反向输出
return 0;
}
高精减
和上面差不多。
主要方法:
- 使用字符串存储数字
- 转换为整型数组
- 模拟竖式减法
- 逆序输出
Code
#include <iostream>
using namespace std;
#define MAXN 10005
string s1,s2;
int a[MAXN],b[MAXN],c[MAXN];
int main()
{
cin>>s1>>s2; //输入
int len1=s1.size(),len2=s2.size(); //两者的长度
if(s1>s2&&len1==len2||len1<len2) //负数处理
{
swap(s1,s2);
swap(len1,len2);
cout<<"-";
}
for(int i=0;i<len1;i++) a[i]=s1[len1-1-i]-48; //逆序存储a(s1)
for(int i=0;i<len2;i++) b[i]=s2[len2-1-i]-48; //逆序存储b(s2)
int i;
for(i=0;i<len1;i++) //高精减法
{
c[i]=a[i]-b[i];
if(c[i]<0)
{
a[i+1]--;
c[i]+=10;
}
}
while(c[i]==0&&i>0) i--; //删除前导0
for(;i>=0;i--) cout<<c[i]; //反向输出
return 0;
}
高精乘
主要方法:
- 使用字符串存储数字
- 转换为整型数组
- 模拟竖式乘法
- 逆序输出
Code
#include <iostream>
using namespace std;
#define MAXN 10005;
string s1,s2;
int a[MAXN],b[MAXN],c[2*MAXN];
int main(){
cin>>s1>>s2;
int len1=s1.size(),len2=s2.size();
for(int i=0;i<len1;i++) a[i]=s1[len1-1-i]-48; //逆序存储a(s1)
for(int i=0;i<len2;i++) b[i]=s2[len2-1-i]-48; //逆序存储b(s2)
for(int i=0;i<len2;i++) for(int j=0;j<len1;j++) c[i+j]+=a[j]*b[i]; //高精乘法
int len=len1+len2;
for(int i=0;i<len;i++)
{
c[i+1]+=c[i]/10; //进位
c[i]%=10;
}
while(c[len]==0&&len>0) len--; //删除前导0
for(;len>=0;len--) cout<<c[len]; //反向输出
return 0;
}
高精除(高精除单精)
主要方法:
- 使用字符串存储数字
- 转换为整型数组
- 模拟竖式除法
- 逆序输出
Code
#include <iostream>
using namespace std;
#define MAXN 10005
string s;
long long x;
int a[MAXN],c[MAXN];
int main(){
cin>>s>>x; //输入
int len1=s.size();
for(int i=0;i<len1;i++) a[i]=s[i]-48; //存储
long long y=0;
for(int i=0;i<len1;i++) //高精除
{
c[i]=(y*10+a[i])/x; //除法
y=(y*10+a[i])%x; //不断往后推
}
int len=0;
while(c[len]==0&&len<len1-1) len++; //删除前导0
for(int i=len;i<len1;i++) cout<<c[i]; //输出
}
总结
其实高精度大部分都是模拟人类的计算方法,就比如列竖式,只要弄清楚他们,高精就能写好。
更好的阅读体验?推荐 该文!
标签:高精度,int,s2,s1,len1,MAXN,size From: https://www.cnblogs.com/zhangyuyi1218/p/-/High_accuracy_algorithm