1051: A × B problem

该程序处理大整数的乘法运算,避免了使用long类型导致的溢出问题。它接受两个大整数作为输入,通过自定义的乘法函数计算它们的乘积,并按照指定的输出格式打印结果。示例中展示了处理1和123456789987654321这两个数相乘的情况。
摘要由CSDN通过智能技术生成

时间限制: 1 Sec 内存限制: 64 MB

题目描述

Redraiment碰到了一个难题,需要请你来帮忙:给你两个整数,请你计算A × B。

输入

数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数。 接着有T组数据,每组数据只有一行,包括两个非负数A和B。 但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出。 但A和B的位数最大不会超过100位。

输出

对应每组测试数据,你都要输出两行: 第一行为:"Case #:", # 代表这是第几组测试数据。 第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果。 你要注意这个等式里包含了几个空格。 要求每组数据之间都需要保留一个空行。

样例输入

2

1 2

123456789 987654321

样例输出

Case 1:

1 * 2 = 2

Case 2:

123456789 * 987654321 = 121932631112635269

提示

来源

Redraiment

多亏了这道题,改了板子的bug...

#include <bits/stdc++.h>
#define cl(x) memset(x,0,sizeof(x))
#define _cl(a,b) memset(a,0,(b+1)<<2)
#define At(x,y) memset(x,y,sizeof x)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define drep(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
#define pb push_back
#define vct vector
#define pq priority_queue
#define all(x) x.begin(),x.end()
#define int long long
#define fi first
#define se second
//#pragma GCC optimize(2)
using namespace std;
inline int min(int a,int b) {return a<b?a:b;}
inline int max(int a,int b) {return a>b?a:b;}
//map<string,map<string,int> > mp;
//pq <ll,vct<ll>,less<ll> > now,last;
//vct<vct<int> > vt(n+1,vct<int>(m+1,0))
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const ll mod=1e9+7;
const int MOD=998244353;
const int N=1e2+10;

int cnt;

vct<int> mul(vct<int> &a,vct<int> &b)
{
    int sa=a.size(),sb=b.size();
    vct<int> c(sa+sb+10,0);
    int t=0;
    for(int i=0;i<sa;i++)
    {
        for(int j=0;j<sb;j++){
            if(i<sa&&j<sb) t=a[i]*b[j];
            int idx=i+j;
            while(t){
                t+=c[idx];
                c[idx++]=t%10;
                t/=10;
            }
        }
    }
    int idx=sa+sb;
    while(t){
        t+=c[idx];
        c[idx]=t%10;
        t/=10;
    }
    while(c.size()>1&&c.back()==0) c.pop_back();
    return c;
}

void solve()
{
    string s1,s2;
    cin>>s1>>s2;
    vct<int> a,b;
    int sa=s1.size(),sb=s2.size();
    for(int i=sa-1;i>=0;i--) a.pb(s1[i]-'0');
    for(int i=sb-1;i>=0;i--) b.pb(s2[i]-'0');
    vct<int> c=mul(a,b);
    int sc=c.size();
    cout<<"Case "<<cnt<<":\n";
    cout<<s1<<" * "<<s2<<" = ";
    for(int i=sc-1;i>=0;i--) cout<<c[i];
    return ;
}
signed main()
{
//    srand(time(NULL));
//    freopen("2022_XinShengSai_1.in", "r", stdin);
//    freopen("2022_XinShengSai_1.out", "w", stdout);
//    ios::sync_with_stdio(false); 
//    cin.tie(0); cout.tie(0);
    int t;
    cin>>t;
//    t=1;
    for(cnt=1;cnt<=t;cnt++){
        solve();
        if(cnt<t) cout<<"\n\n";
    }
    
    return 0;
}
/*
1
1 2
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值