- 公共部分
struct hp{ int len; int s[LEN+1]; hp(){ len=1; int i; for(i=1;i<=LEN;i++){ s[i]=0; } } hp(char* ch){ int i; len=strlen(ch); for(i=1;i<=len;i++) s[i]=ch[len-i]-48; for(;i<=LEN;i++) s[i]=0; } void print(){ int i; for(i=len;i>=1;i--) printf("%d",s[i]); } };
定义了高精度数据结构“hp”,并且定义了输入(构造函数),输出(print),以及初始化(默认构造函数),隐藏了部分细节。
并且hp内部存储的数据是真实数据的逆序,但是在输入和输出的时候自动换序
- 高精度乘高精度
代码:
void multiplyh(const hp& a,const hp& b,hp& c){ int i,j,len; c=hp(); for(i=1;i<=a.len;i++){ for(j=1;j<=b.len;j++){ c.s[i+j-1]+=a.s[i]*b.s[j]; c.s[i+j]+=c.s[i+j-1]/10; c.s[i+j-1]%=10; } } len=a.len+b.len+1; while(len>1 && c.s[len]==0)len--; c.len=len; }
代码理解:
这是一段相当精简的代码,非常有利于程序员记忆。我昨天还在学习一个很复杂的模板,今天看到这个代码直接弃了。复杂代码:
void mult(char a[],char b[],char s[]){//a 被乘数,b 乘数,t 结果 int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0; char result[65]; alen=strlen(a); blen=strlen(b); for(i=0;i<alen;i++) for(j=0;j<blen;j++) res[i][j]=(a[i]-48)*(b[j]-48); for(i=alen-1;i>=0;i--){ //i: a的下标逆序循环 for(j=blen-1;j>=0;j--) //j: b的下标逆序循环 sum+=res[i+blen-j-1][j]; result[k]=sum%10; k++; sum/=10; } for(i=blen-2;i>=0;i--){ for(j=0;j<=i;j++) sum+=res[i-j][j]; result[k]=sum%10; k++; sum/=10; } if(sum!=0){ result[k]=sum; k++; } for(i=0;i<k;i++) result[i]+=48; for(i=k-1;i>=0;i--) s[i]=result[k-1-i]; s[k]=0; while(1){ if(strlen(s)!=strlen(a) && s[0]==48) strcpy(s,s+1); else break; } }