• 高精度乘法


    问题 J: 【高精度】高精度乘法

    时间限制: 1 Sec  内存限制: 64 MB
    提交: 34  解决: 17
    [提交][状态][讨论版]

    题目描述

    牢门上的第三道锁,需要使用高精度乘法来破译出相应密码,当然,必须使用“万进制算法”计算两个非负整数A、B的积,其中A和B的位数在10000位以内。

    输入

    共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A、B的位数均在10000以内。

    输出

    输出一个数,即A和B的乘积。

    样例输入

    2
    3
    

    样例输出

    6

    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    char a[10001];//储存a,由低位到高位
    char b[10001];//储存a,由低位到高位
    char c1[10001];//临时存储
    char c2[10001];//临时存储
    int f[20000]={0};//存放结果,逆序
    
    void cheng(int la,int lb){
        int k=0;
        int ge;
        int shi;
        if(la>=lb){
            for(int i=0;i<lb;i++){
                for(int j=0;j<la;j++){
                    f[k+j]+=(a[j]-'0')*(b[i]-'0');
                }
                k++;
            }
            for(int l=0;l<=(la+lb-1);l++){
                if(f[l]>=10){
                    ge=f[l]%10;
                    shi=f[l]/10;
                    f[l]=ge;
                    f[l+1]+=shi;
                }
            }
        }
        if(la<lb){
            for(int i=0;i<la;i++){
                for(int j=0;j<lb;j++){
                    f[k+j]+=(b[j]-'0')*(a[i]-'0');
                }
                k++;
            }
            for(int l=0;l<=(lb+la-1);l++){
                if(f[l]>=10){
                    ge=f[l]%10;
                    shi=f[l]/10;
                    f[l]=ge;
                    f[l+1]+=shi;
                }
            }
        }
    }
    
    void print(int l){
        int k=0;
        for(int j=l;j>=0;j--){
            if(f[j]==0){
                k++;
            }else{
                break;
            }
    
        }
        if(k==l+1){
            printf("0");
        }else{
            for(int i=l-k;i>=0;i--){
                printf("%d",f[i]);
            }
        }
    }
    
    int main()
    {
        int la;
        int lb;
        while(scanf("%s %s",c1,c2)!=EOF){
            la=strlen(c1);
            for(int i=0;i<la;i++){
                a[i]=c1[la-1-i];
            }
            lb=strlen(c2);
            for(int i=0;i<lb;i++){
                b[i]=c2[lb-1-i];
            }
            cheng(la,lb);
            print(la+lb-1);
            printf("
    ");
            memset(f,0,20000*sizeof(int));
        }
        return 0;
    }




  • 相关阅读:
    start internal web server in .net 2.0
    windows scripts tips
    move vs2k3 to vs2k5
    w2k telnet port change
    Webservice自动表生成TableForGen
    用C#改写Head First Design PatternsSingleTon(原创)
    使用反射创建动态模块
    使用反射将委托挂钩
    用C#改写Head First Design PatternsState(原创)
    用Xmlhttp无刷新更新DIV
  • 原文地址:https://www.cnblogs.com/TWS-YIFEI/p/5677572.html
Copyright © 2020-2023  润新知