c++高精度運算(加、乘)
阿新 • • 發佈:2019-01-05
#include <stdio.h> #include <iostream> #include <memory.h> #include <math.h> using namespace std; #define MI 1000 /*****************high precision computation********************/ int hpcAdd(char* a,char* b,int lena,int lenb,char *re) { memset(re,0,MI); char rest=0; char tmp=0; int len=max(lena,lenb); int i; for(i=0;i<len;i++) { tmp=a[i]+b[i]+rest; re[i]=tmp%10; rest=tmp/10; } if(rest>0) { len++; re[len-1]=rest; } return len; } int hpcMui(char* a,char* b,int lena,int lenb,char *re) { memset(re,0,MI+MI); char rest=0; char tmp=0; int len; int i,j,l; for(i=0;i<lena;i++) { for(j=0;j<lenb;j++) { tmp=a[i]*b[j]; re[i+j]+=tmp%10; re[i+j+1]+=tmp/10; l=i+j; while(re[l]>=10) { re[l]=re[l]%10; tmp=re[l]/10; re[++l]+=tmp; } } } for(i=MI*2-1;i>=0;i--) { if(re[i]!=0) { break; } } i++; len=i; cout<<len<<endl; return len; } char turnUpsideDown(char* a,int lena) { //陣列逆置 int i;int j;char t; i=0; j=lena-1; while(i<j) { t=a[i]; a[i]=a[j]; a[j]=t; ++i; --j; } return 0; } char turntooutput(char *a,int len) { int i; for(i=0;i<len;++i) { a[i]+=48; } } int main() { cout<<"Input the two number:"; char tina[MI],tinb[MI]; char a[MI]; char b[MI]; char aAdd[MI]; int ladd; char aMui[MI+MI]; int lmui; memset(a,0,MI); memset(b,0,MI); int lena,lenb; cin>>tina>>tinb; cout<<endl; //一次性讀入使用者輸入的資料 int i,j; char t; i=0; j=0; //解析資料 while( 48<=tina[i] && tina[i]<=57 && i<MI) { a[i]=tina[i]-48; ++i; } lena=i; while( 48<=tinb[j] && tinb[j]<=57 && i<MI) { b[j]=tinb[j]-48; ++j; } lenb=j; turnUpsideDown(a,lena); //陣列逆置 turnUpsideDown(b,lenb); //陣列逆置 ladd=hpcAdd(a,b,lena,lenb,aAdd); lmui=hpcMui(a,b,lena,lenb,aMui); turnUpsideDown(aAdd,ladd); turntooutput(aAdd,ladd); turnUpsideDown(aMui,lmui); turntooutput(aMui,lmui); cout<<aAdd<<endl<<aMui<<endl; return 0; }