高精度
高精度,即无法使用 C++ 本身配置的数据类型中使用的运算
高精度加法
例题:P1601 A+B Problem
主要方法:
- 使用字符串存储数字
- 转换为整型数组
- 模拟竖式加法
- 逆序输出
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--; //删除前导0for(;i>=0;i--) cout<<c[i]; //反向输出return 0;
}
高精减
例题:P2142 A-B Problem。
和上面差不多。
主要方法:
- 使用字符串存储数字
- 转换为整型数组
- 模拟竖式减法
- 逆序输出
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--; //删除前导0for(;i>=0;i--) cout<<c[i]; //反向输出return 0;
}
高精乘
例题:P1303 A*B Problem
主要方法:
- 使用字符串存储数字
- 转换为整型数组
- 模拟竖式乘法
- 逆序输出
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--; //删除前导0for(;len>=0;len--) cout<<c[len]; //反向输出return 0;
}
高精除(高精除单精)
例题:P1480 A/B Problem
主要方法:
- 使用字符串存储数字
- 转换为整型数组
- 模拟竖式除法
- 逆序输出
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++; //删除前导0for(int i=len;i<len1;i++) cout<<c[i]; //输出
}
总结
其实高精度大部分都是模拟人类的计算方法,就比如列竖式,只要弄清楚他们,高精就能写好。
更好的阅读体验?推荐 该文!