高精度运算模板
2017-10-25 19:44
302 查看
去年这个时候问亲爱的hfu老师NOIP考不考高精度,hfu老师满不在意地说这几年早都不怎么考了不用管。一年后的今天,只听见机房门口:“好同yue们,这个高精度,还是要去看一下,哈~~~。万一他考到了。。。”
好吧那就硬着头皮自己写模板吧。
估计即使用高精也是乘爆或者加爆long long应该不会是除法,再加上时间紧迫,先附上加减乘三种运算的模板。
codevs 3116 高精度加法
codevs 3115 高精度减法
codevs 3117 高精度乘法
好吧那就硬着头皮自己写模板吧。
估计即使用高精也是乘爆或者加爆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; }