高精度运算

众所周知,c++有一种变量叫int_64……

好吧NOI与CSP貌似不支持int_64的样子

高精度加法

思想

将两个加数作为

具体过程

高精度乘法

    for(int i=0;i<la;i++){
            for(int j=0;j<lb;j++){
                f=x[i]*y[j];        //f:记录结果
                jw=f/10;        //jw:记录进位
                f%=10;
                w=i+j;        //精髓:w:每次数组的下标
                //这里可以参考竖式乘法,i位与j位相乘应存储在i+j位
                z[w]+=f;
                z[w+1]+=jw+z[w]/10;//处理进位
                z[w]%=10;
            }
        }

完整代码

    #include<bits/stdc++.h>
    using namespace std;
    long long la,lb,lc,x[20010],y[20010],z[20010],w,jw,f;        //注意数据大小
    char a[20010],b[20010];
    int main(){
        scanf("%s",a);
        scanf("%s",b);
        la=strlen(a);
        lb=strlen(b);
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        memset(z,0,sizeof(z));
        for(int i=0;i<la;i++)	x[la-i-1]=a[i]-'0';
        for(int i=0;i<lb;i++)	y[lb-i-1]=b[i]-'0';
        for(int i=0;i<la;i++){
            for(int j=0;j<lb;j++){
                f=x[i]*y[j];        //f:记录结果
                jw=f/10;        //jw:记录进位
                f%=10;
                w=i+j;        //w:每次数组的下标
                z[w]+=f;
                z[w+1]+=jw+z[w]/10;//处理进位
                z[w]%=10;
            }
        }
        lc=la+lb;
        while(z[lc]==0)	lc--;
        if(lc<0)	printf("%d",0);
        else{
            for(int i=lc;i>=0;i--)	printf("%lld",z[i]);
        }
        return 0;
    }

典例

12-26 09:06