高精-----各种模板
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精-----各种模板相关的知识,希望对你有一定的参考价值。
高精加法
代码
#include<string> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char a[501],b[501]; int x[501],y[501],z[50000]; int main() { cin>>a; cin>>b; int l1=strlen(a),l2=strlen(b); for(int i=0;i<l1;i++) x[l1-i]=a[i]-48; for(int i=0;i<l2;i++) y[l2-i]=b[i]-48; int l3=1,s=0; while(l3<=l1||l3<=l2) { z[l3]=x[l3]+y[l3]+s; s=z[l3]/10; z[l3]%=10; l3++; } z[l3]=s; while(z[l3]==0) l3--; for(int i=l3;i>0;i--) cout<<z[i]; return 0; }
高精减
代码
已规定 a>b!!!!!!
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char a[201],b[201]; int x[201],y[201],c[201]; int main() { cin>>a; cin>>b; int la=strlen(a),lb=strlen(b); for(int i=0;i<la;i++) x[la-i]=a[i]-‘0‘; for(int i=0;i<lb;i++) y[lb-i]=b[i]-‘0‘; int i=1,m; while(i<=la||i<=lb) { if(x[i]<y[i]) { x[i]+=10; x[i+1]--; } c[i]=x[i]-y[i]; i++; } m=i; while(c[m]==0) m--; for(int j=m;j>0;j--) cout<<c[j]; return 0; }
未规定 a>b!!!!
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char a[501],b[501],d[501];
int x[501],y[501],c[501];
int main()
{
cin>>a;
cin>>b;
if(strlen(a)<strlen(b)||strlen(a)==strlen(b)&&strcmp(a,b)<0)
{
strcpy(d,a);
strcpy(a,b);
strcpy(b,d);
cout<<"-";
}
int la=strlen(a),lb=strlen(b);
for(int i=0;i<la;i++)
x[la-i]=a[i]-‘0‘;
for(int i=0;i<lb;i++)
y[lb-i]=b[i]-‘0‘;
int i=1,m;
while(i<=la||i<=lb)
{
if(x[i]<y[i])
{
x[i]+=10;
x[i+1]--;
}
c[i]=x[i]-y[i];
i++;
}
m=i;
while(c[m]==0)
m--;
for(int j=m;j>0;j--)
cout<<c[j];
return 0;
}
高精例题
3054 高精度练习-文件操作
代码
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char a[501],b[502]; int x[501],y[502],c[250001]; int main() { memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); memset(c,0,sizeof(c)); cin>>a; cin>>b; int la=strlen(a),lb=strlen(b); for(int i=0;i<la;i++) x[la-i]=a[i]-‘0‘; for(int i=0;i<lb;i++) y[lb-i]=b[i]-‘0‘; for(int i=1;i<=la;i++) { int m=0; for(int j=1;j<=lb;j++) { c[i+j-1]=x[i]*y[j]+c[i+j-1]+m;//在此可发现一个规律 //当前乘积的位=两乘数当前要乘两数的位的和减一 m=c[i+j-1]/10; c[i+j-1]%=10; } c[i+lb]=m; } int l=la+lb; //可发现乘积的最终位数 =两乘数个位数的和 while(c[l]==0&&l>1) l--; for(int i=l;i>0;i--) cout<<c[i]; return 0; }
高精除
高精除低精
代码
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char a[501]; int b,x[501],c[501],y=0; int main() { memset(c,0,sizeof(c)); memset(x,0,sizeof(x)); gets(a); int la=strlen(a); cin>>b; for(int i=0;i<la;i++) x[i+1]=a[i]-‘0‘; for(int i=1;i<=la;i++) { c[i]=(y*10+x[i])/b; y=(y*10+x[i])%b; } int l=1; while(l<la&&c[l]==0) l++; for(int i=l;i<=la;i++) cout<<c[i]; return 0; }
高精除高精
代码
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,a[501],b[501],c[501],ans,i; void init(int a[]) { string s; cin>>s; a[0]=s.length(); for(int i=1;i<=a[0];i++) a[i]=s[a[0]-i]-‘0‘; } void print(int a[]) { int i; if(a[0]==0) { cout<<0<<endl; return; } for(int i=a[0];i>0;i--) cout<<a[i]; cout<<endl; return; } int compare (int a[],int b[]) { int i; if(a[0]>b[0]) return 1; if(a[0]<b[0]) return -1; for(int i=a[0];i>0;i--) { if(a[i]>b[i]) return 1; if(a[i]<b[i]) return -1; } return 0; } void jian(int a[],int b[]) { int flag,i; flag=compare(a,b); if(flag==0) { a[0]=0; return ; } if(flag==1) { for(int i=1;i<=a[0];i++) { if(a[i]<b[i]) { a[i+1]--; a[i]+=10; } a[i]-=b[i]; } while(a[0]>0&&a[a[0]]==0) a[0]--; return ; } } void numcpy(int p[],int q[],int det) { for(int i=1;i<=p[0];i++) q[i+det-1]=p[i]; q[0]=p[0]+det-1; } void chugao(int a[],int b[],int c[]) { int i,tmp[501]; c[0]=a[0]-b[0]+1; for(int i=c[0];i>0;i--) { memset(tmp,0,sizeof(tmp)); numcpy(b,tmp,i); while(c[0]>0&&c[c[0]]==0) c[0]--; return ; } } int main() { init(a); init(b); chugao(a,b,c); print(c); return 0; }
高精开根
以上是关于高精-----各种模板的主要内容,如果未能解决你的问题,请参考以下文章