• 公共部分
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;
    }
}
View Code

相关文章: