高精度
高精度
高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。
高精度加法
#include<stdio.h> #include<string.h> char a[1000],b[1000]; char c[1000]; int i; void swap(char a[]) { char tmp; for(int i=0;i<strlen(a)/2;i++) { tmp=a[i]; a[i]=a[strlen(a)-1-i]; a[strlen(a)-1-i]=tmp; } } void add(char a[],char b[]) { for(i=0;i<strlen(a)&&i<strlen(b);i++) { c[i]+=a[i]+b[i]-'0'; if(c[i]-'0'>=10) { c[i]=c[i]-10; c[i+1]=1; } } if(strlen(a)==strlen(b)) if(c[i]==1) c[i]='1'; if(strlen(a)>strlen(b)) { if(c[i]==1) { for(;i<strlen(a);i++) { c[i]+=a[i]; if(c[i]-'0'>=10) { c[i]=c[i]-10; c[i+1]=1; } } if(c[i-1]=='0') c[i]='1'; } else for(;i<strlen(a);i++) c[i]=a[i]; } if(strlen(b)>strlen(a)) { if(c[i]==1) { for(;i<strlen(b);i++) { c[i]+=b[i]; if(c[i]-'0'>=10) { c[i]=c[i]-10; c[i+1]=1; } } if(c[i]==1) c[i]='1'; } else for(;i<strlen(b);i++) c[i]=b[i]; } } int main() { scanf("%s",a); scanf("%s",b); swap(a); swap(b); add(a,b); swap(c); printf("%s",c); return 0; }
高精度减法
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; char a[1001],b[1001]; int a1[1001],b1[1001]; int c[1001]; int i,j,al,bl,l; int main() { scanf("%s",a); scanf("%s",b); al=strlen(a); bl=strlen(b); l=al>bl?al:bl; for(i=0;i<al;i++) a1[al-i-1]=a[i]; for(i=0;i<bl;i++) b1[bl-i-1]=b[i]; for(i=l-1;i>=0;i--) { if(al>bl || a1[i]>b1[i]) { for(j=0;j<l;j++){ c[j]=a1[j]-b1[j]+'0'; if(b1[j]==0) c[j]-='0'; } for(j=0;j<l-1;j++) if(c[j]<'0') { c[j]+=10; c[j+1]--; } while(c[l-1]=='0'&&l!=0) l--; for(j=l-1;j>=0;j--) printf("%c",c[j]); break; } if(al<bl||a1[i]<b1[i]) { for(j=0;j<l;j++) { c[j]=b1[j]-a1[j]+'0'; if(a1[j]==0) c[j]-='0'; } for(j=0;j<l-1;j++) if(c[j]<'0') { c[j]+=10; c[j+1]--; if(c[j+1]=='0'&&j+1==l-1) l--; } while(c[l-1]=='0'&&l!=0) l--; printf("-"); for(j=l-1;j>=0;j--) printf("%c",c[j]); break; } } return 0; }
高精度乘法
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int jw,sum,ac,bc,k; int a,b,ans[10000]; string A; string B; int main() { cin>>A>>B; ac=A.size()-1; bc=B.size()-1; for(int i=0;i<=ac;i++) { a=A[ac-i]-'0'; for(int j=0;j<=bc;j++) { k=i+j; b=B[bc-j]-'0'; ans[k]+=a*b; if(ans[k]>=10) { ans[k+1]+=ans[k]/10; ans[k]%=10; } } } if(ans[k+1]>0) k++; for(int i=k;i>=0;i--) cout<<ans[i]; return 0; } Square 【开方】: #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<iostream> int l; int work(int o,char *O,int I) { char c,*D=O ; if(o>0) { for(l=0;D[l];D[l++]-=10) { D[l++]-=120; D[l]-=110; while(!work(0,O,l)) D[l]+=20; putchar((D[l]+1032)/20); } putchar(10); } else { c=o+(D[I]+82)%10-(I>l/2)*(D[I-l+I]+72)/10-9; D[I]+=I<0 ? 0 : !(o=work(c/10,O,I-1))*((c+999)%10-(D[I]+92)%10); } return o; } int main() { char s[1200]; s[0]='0'; scanf("%s",s+1); if(strlen(s)%2==1) work(2,s+1,0); else work(2,s,0); return 0; }