题解 P1303 【A*B Problem】

· · 题解

蒟蒻奉上

第三十篇的题解,

总的说就是想一下 0小学0 学的乘法竖式

然后第一层循环 附代码 #

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int la,lb,s,n,a[10100],b[10100],ans[110000];
string aa,bb;//string好用
int main()
{
    cin>>aa>>bb;//直接输入
    la=aa.size();//他们的大小
    lb=bb.size();
    for(int i=1;i<=la;++i)//由字符转化成数字
        a[i]=aa[la-i]-'0';
    for(int i=1;i<=lb;++i)
        b[i]=bb[lb-i]-'0';
    for(int i=1;i<=la;++i)//竖式的下边
    {
        s=0;
        for(int j=1;j<=lb;++j)//竖式的上边
        {
            ans[i+j-1]+=a[i]*b[j]+s;//相乘+上一次多出
            s=ans[i+j-1]/10;//来的,再整理一下ans和s
            ans[i+j-1]%=10;//准备下一次使用
        }
        ans[i+lb]=s;//最后s有剩余的时候特别判一下
    }
    int n=la+lb;//最多这么多
    while(ans[n]==0&&n>0)//多的时候去掉前缀
        n--;
    if(!n)//答案是0的时候ans都删没了,所以这个也要处理
        cout<<0;
    while(n)//倒着输出
        printf("%d",ans[n--]);
    return 0;
}

总的来说很简单,细心,细心,细心说三遍