高精度与低精度的乘法

思路:将低精度num看成一个整体(int存储),再用高精度的低位依次乘num,个位作为结果,其他位作为进位传递。

输入、输出、转换与高精度加法一样。最后要注意判断进位是否为零,若不为零则用循环取个位依次存储至数组高位(进位可能不止一位)。

代码:

#include<cstdio>
#include<cstring>

struct bign{
    int d[1000];
    int len;
    bign(){
        memset(d,0,sizeof(d));
        len=0;
    }
};

bign change(char str[]){
    bign a;
    a.len=strlen(str);
    for(int i=0;i<a.len;i++){
        a.d[i]=str[a.len-1-i]-'0';
    }
    return a;
}

bign multi(bign a,int num){
//将num始终作为一个整体,用高精度的每一位分别乘以num。
//保留个位作为结果,其他位作为进位向前传递 
    bign b;
    int carry=0;//进位 
    for(int i=0;i<a.len;i++){
        int temp=a.d[i]*num+carry;
        b.d[b.len++]=temp%10;
        carry=temp/10;
    }
    while(carry!=0){
        b.d[b.len++]=carry%10;
        carry/=10;
    }
    return b;
}

void print(bign a){
    for(int i=a.len-1;i>=0;i--){
        printf("%d",a.d[i]);
    }
}

int main()
{
    char str[1000];
    int num;
    scanf("%s%d",str,&num);
    bign a=change(str);
    print(multi(a,num));
    return 0;
}
View Code

 

posted @ 2022-04-12 13:10  顾南  阅读(83)  评论(0)    收藏  举报