• 【字符串】【AOJ-152】A × B problem(大数相乘、高精度乘法)


    Description
    给你两个整数,请你计算A × B。
    Input
    数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数。
    接着有T组数据,每组数据只有一行,包括两个正整数A和B(可能以0起头)。
    但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出。
    但A和B的位数最大不会超过100位。
    Output
    对应每组测试数据,你都要输出两行:
    第一行为:"Case #:", # 代表这是第几组测试数据。
    第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果。
    你要注意这个等式里包含了几个空格。
    要求每组数据之后都需要保留一个空行。
    Sample Input
    2
    1 2
    123456789 0987654321
    

     
    Sample Output
    Case 1:
    1 * 2 = 2
    
    Case 2:
    123456789 * 0987654321 = 121932631112635269
    
    
    思路:
    和高精度加法差不多 用字符串储存
    把字符串中的字符转成数字存到一个int数组里 接着先进行乘法运算 然后处理进位移位 注意c[i+j]可以很好的处理空0的地方
     
    参考代码:
    #include <stdio.h>
    #include <string.h>
    #define LEN 110
    
    void del(char *a,int n) 
    { 
        int i,len; 
        len=strlen(a); 
        for(i=0;i<len-n;i++) 
            a[i]=a[i+n]; 
        a[i]=''; 
    }
    int main()
    {
        char a[LEN],b[LEN],sa[LEN],sb[LEN];
        int s1[LEN],s2[LEN],c[2*LEN];
        int t,flag=1;
        int i,j,n=0;
        int lena,lenb;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%s%s",a,b);
            strcpy(sa,a);
            strcpy(sb,b);
    
            for(i=0,n=0;a[i]!='';i++)
            {
                if(a[i]=='0')
                    n++;
                else
                    break;
            }
            del(a,n);
            for(i=0,n=0;b[i]!='';i++)
            {
                if(b[i]=='0')
                    n++;
                else
                    break;
            }
            del(b,n);//删除前导0
            memset(s1,0,sizeof(s1));
            memset(s2,0,sizeof(s2));
            memset(c,0,sizeof(c));
            lena=strlen(a);
            lenb=strlen(b);
            for(i=0;i<lena;i++)
                s1[i]=a[lena-1-i]-'0';
            for(i=0;i<lenb;i++)
                s2[i]=b[lenb-1-i]-'0';//转换为数字
            for(i=0;i<lena;i++)
                for(j=0;j<lenb;j++)
                    c[i+j]+=s1[i]*s2[j];//计算
            for(i=0;i<lena+lenb;i++)//处理进位 移位
            {
                c[i+1]+=c[i]/10;
                c[i]=c[i]%10;
            }
            printf("Case %d:
    %s * %s = ",flag++,sa,sb);
            if(c[lena+lenb-1]==0)
                for(i=lena+lenb-2;i>=0;i--)
                    printf("%d",c[i]);
            else
                for(i=lena+lenb-1;i>=0;i--)
                    printf("%d",c[i]);
            printf("
    ");
            printf("
    ");
    
        }
        return 0;
    }
  • 相关阅读:
    Fibonacci数列2
    足球队
    网页导航
    Catenyms
    某种密码
    大逃亡
    球的序列
    圆内三角形统计
    最小平方数

  • 原文地址:https://www.cnblogs.com/ahu-shu/p/3484537.html
Copyright © 2020-2023  润新知