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

    题目描述:输入两个正整数A,B,计算A * B输出结果 

    输入:输入包含多行,第一行表示测试数目,以后每行包含两个正整数A,B(A,B的位数小于200位)

    输出:针对每一行输入,输出一行代表A*B的结果 

    此题是一个高精度问题,采取的算法是模拟乘法过程。

    用到字符三个数组。s1,s2用来接收A,B的值,S3用来存取结果。

    S3从数组下标最大开始存。

    代码如下:

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    char s1[201],s2[201],s3[401];
    int main()
    {
        int i,j,n,k1,k2,k,t,d,m;
        scanf("%d",&n);
        while(n--)
        {
            memset(s3,0,sizeof(s3));
            scanf("%s%s",s1,s2);
            k1=strlen(s1);k2=strlen(s2);
            for(i=k1-1;i>=0;i--)//将字符转化为数字
                s1[i]-='0';
            for(i=k2-1;i>=0;i--)
                s2[i]-='0';
            k=400;
            for(i=k1-1;i>=0;i--)//模拟乘法过程,每一次循环即模拟S1中的一个数字和S2相乘
            {
                m=0;            //m表示乘法过程产生的进位
                for(j=k2-1;j>=0;j--)
                {
                    t=k-(k2-j-1);//t用来指示乘法过程中的位数的下标
                    d=s2[j]*s1[i];
                    s3[t]+=d%10+m;
                    m=s3[t]/10+d/10;
                    s3[t]%=10;   
                }
                s3[t-1]+=m;//将最后一个产生的进位保存
                k--;//k表示每一个S2中的数字和S1相乘时的最低位的下标
            }
            for(i=0;i<=400&&s3[i]==0;i++);//输出时除去前导0
            for(j=i;j<=400;j++)
                printf("%d",s3[j]);
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    P1119 灾后重建
    P1824 进击的奶牛
    P3743 kotori的设备
    【MM配置】SAP MM模块配置目录(转)
    【SAP参数文件】SAP参数文件(转)
    【MM】供应商删除
    【Debug】修改数据库表数据的方法
    【MM 单位换算】物料基本单位换算
    EDI RFC IDOC
    【打印配置】SAP打印机配置
  • 原文地址:https://www.cnblogs.com/duan-to-success/p/3472796.html
Copyright © 2011-2022 走看看