您的位置:首页 > 其它

高精度运算模板

2017-10-25 19:44 302 查看
去年这个时候问亲爱的hfu老师NOIP考不考高精度,hfu老师满不在意地说这几年早都不怎么考了不用管。一年后的今天,只听见机房门口:“好同yue们,这个高精度,还是要去看一下,哈~~~。万一他考到了。。。”

好吧那就硬着头皮自己写模板吧。

估计即使用高精也是乘爆或者加爆long long应该不会是除法,再加上时间紧迫,先附上加减乘三种运算的模板。

codevs 3116 高精度加法

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define fil(a,b) memset(a,b,sizeof(a))
const int MAXN=10004;
struct None_Negative_Big_Number_Operate {
char s[2][MAXN];
int len[2];
void read() {
scanf("%s%s",s[0]+1,s[1]+1);
len[0]=strlen(s[0]+1),len[1]=strlen(s[1]+1);
}
void add() {
int a[MAXN],b[MAXN],ans[MAXN];
fil(a,0),fil(b,0);
int mxlen=max(len[0],len[1]);
for (int i=1;i<=len[0];++i) a[i]=s[0][len[0]-i+1]-'0';
for (int i=1;i<=len[1];++i)	b[i]=s[1][len[1]-i+1]-'0';
for (int i=1;i<=mxlen;++i) {
int temp=a[i]+b[i];
if (temp>9) ans[i]=temp%10,++a[i+1];
else ans[i]=temp;
}
if (a[mxlen+1]) printf("1");
for (int i=mxlen;i;--i) printf("%d",ans[i]);
puts("");
}
}bn;
int main() {
bn.read();
bn.add();
return 0;
}

codevs 3115  高精度减法

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define fil(a,b) memset(a,b,sizeof(a))
const int MAXN=10004;
struct None_Negative_Big_Number_Operate {
char s[2][MAXN];
int len[2];
void read() {
scanf("%s%s",s[0]+1,s[1]+1);
len[0]=strlen(s[0]+1),len[1]=strlen(s[1]+1);
}
inline bool cmp() {
if (len[0]<len[1]) return 1;
if (len[0]>len[1]) return 0;
for (int i=len[0];i;--i) {
if (s[0][i]<s[1][i]) return 1;
if (s[0][i]>s[1][i]) return 0;
}
return 0;
}
void minus() {
int a[MAXN],b[MAXN],ans[MAXN];//x:被减数,y:减数
fil(a,0),fil(b,0);
for (int i=1;i<=len[0];++i) a[i]=s[0][len[0]-i+1]-'0';
for (int i=1;i<=len[1];++i) b[i]=s[1][len[1]-i+1]-'0';
bool bg=cmp();
int mxlen=max(len[0],len[1]);
for (int i=1;i<=mxlen;++i) {
int temp;
temp=(!bg)?a[i]-b[i]:b[i]-a[i];
if (temp<0) ans[i]=temp+10,(!bg)?--a[i+1]:--b[i+1];
else ans[i]=temp;
}
while (!ans[mxlen]&&mxlen) --mxlen;
if (!mxlen) {puts("0");return ;}
if (bg) printf("-");
while (mxlen) printf("%d",ans[mxlen--]);
puts("");
}
}bn;
int main() {
bn.read();
bn.minus();
return 0;
}


codevs 3117 高精度乘法

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define fil(a,b) memset(a,b,sizeof(a))
const int MAXN=10004;
struct None_Negative_Big_Number_Operate {
char s[2][MAXN];
int len[2];
void read() {
scanf("%s%s",s[0]+1,s[1]+1);
len[0]=strlen(s[0]+1),len[1]=strlen(s[1]+1);
}
void multiply() {
int a[MAXN],b[MAXN],ans[MAXN];
fil(a,0),fil(b,0),fil(ans,0);
for (int i=1;i<=len[0];++i) a[i]=s[0][len[0]-i+1]-'0';
for (int i=1;i<=len[1];++i) b[i]=s[1][len[1]-i+1]-'0';
int mxlen=len[0]+len[1];
for (int j=1;j<=len[1];++j)
for (int i=1;i<=len[0];++i)
ans[i+j-1]+=a[i]*b[j];
for (int i=1;i<=mxlen;++i)
ans[i+1]+=ans[i]/10,ans[i]%=10;
while (!ans[mxlen]&&mxlen) --mxlen;
if (!mxlen) {puts("0");return ;}
while (mxlen) printf("%d",ans[mxlen--]);
puts("");
}
}bn;
int main() {
bn.read();
bn.multiply();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  高精度