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;
    }
  • 相关阅读:
    vi 命令 使用方法
    再论C++之垃圾回收(GC)
    Iterative (non-recursive) Quick Sort
    DirectSound的应用
    JavaScript也能求爱哦
    lol匹配算法
    一年成为Emacs高手(像神一样使用编辑器)
    SSH深度历险(四) Maven初步学�
    char* 和char[]的差别
    数据仓库与数据挖掘的一些基本概念
  • 原文地址:https://www.cnblogs.com/duan-to-success/p/3472796.html
Copyright © 2011-2022 走看看