加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

AOJ152 A X B problem(大数相乘、高精度乘法)

发布时间:2020-12-14 03:43:03 所属栏目:大数据 来源:网络整理
导读:Description 给你两个整数,请你计算A × B。 ? Input 数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数。 接着有T组数据,每组数据只有一行,包括两个正整数A和B(可能以0起头)。 但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出。 但
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,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:n%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("n");
        printf("n");

    }
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读