zoukankan      html  css  js  c++  java
  • 高精度乘法

    主代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int main(){
        char al[101],bl[101];
        int a[101],b[101],c[10001],lena,lenb,lenc,i,j,x;//所有需要的东西
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));//这三行为清零操作(memset)
        scanf("%s",al);//输入第一个乘数
        scanf("%s",bl);//第二个
        lena=strlen(al);
        lenb=strlen(bl);//计算两个乘数的位数
        for(i=0;i<=lena-1;i++)a[lena-i]=al[i]-48;//利用ascll码性质,0的ascll码为48.减去零就是ascll减去48,成功将字符转化为数字
        for(i=0;i<=lenb-1;i++)b[lenb-i]=bl[i]-48;//同上
        for(i=1;i<=lena;i++)//根据乘法竖式原理:12——第一行,对应外层for
                  //        * 12——第二行,对应内层for
                  //        _____
                  //          4
                  //         2
                  //         2
                  //         1
      `           //        _____
                  //         144 { x
    =0; for(j=1;j<=lenb;j++) { c[i+j-1]=a[i]*b[j]+x+c[i+j-1];//核心算法,两个数每一位分别相乘再加上x(上一位的进位) x=c[i+j-1]/10; c[i+j-1]%=10; } c[i+lenb]=x;//确定进位 } lenc=lena+lenb; while(c[lenc]==0&&lenc>1)//如果最高为上为零,lenc减一,消去 lenc--; for(i=lenc;i>=1;i--)//此for用来一位一位倒序输出 cout<<c[i]; cout<<endl; return 0; }

    更精简明了的高精模板:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    #define re register
    using namespace std;
    inline int read()
    {
        int x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    char k[2003];
    int lena,lenb,lenc,a[2003],b[2003],c[4019];
    int main()
    {
        cin>>k;
        lena=strlen(k);
        for(int i=1;i<=lena;i++)
            a[i]=k[lena-i]-'0';
        memset(k,0,sizeof(k));
        cin>>k;
        lenb=strlen(k);
        for(int i=1;i<=lenb;i++)
            b[i]=k[lenb-i]-'0';
        for(int i=1;i<=lena;i++)
            for(int j=1;j<=lenb;j++)
            {
                c[i+j-1]+=a[i]*b[j];
            } 
        for(int i=1;i<=lena+lenb;i++)
        {
            if(c[i]>9)
            {
                c[i+1]+=c[i]/10;c[i]%=10;
            }
        }
        lenc=lena+lenb;
        while(c[lenc]==0&&lenc>1)lenc--;
        for(int i=lenc;i>=1;i--)
            printf("%d",c[i]);
        return 0;
    }
  • 相关阅读:
    Delphi 获取不重复随机数《LceMeaning》
    轻松一下
    MS SQL字段类型详解《转》
    Go语言优势与劣势
    go语言特点
    初始go语言
    django 短链接改成长连接
    extjs [1]
    Supervisor安装与配置
    InfluxDB命令使用
  • 原文地址:https://www.cnblogs.com/lbssxz/p/10464379.html
Copyright © 2011-2022 走看看