第一种实现代码简单,对数据有一定限制
思路是把乘数与被乘数的每一位相乘
代码1:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[10000];
int main() {
ll carry=0;
string q;
ll p;
cin>>p>>q;
ll cnt=1;
for(ll i=q.size()-1;i>=0;i--)
{
a[cnt++]=q[i]-'0';
}
for(ll j=1;j<cnt;j++)
{
ll temp=a[j]*p+carry;
a[j]=temp%10;
carry=temp/10;
}
while(carry)
{
a[cnt++]=carry%10;
carry/=10;
}
for(ll i=cnt-1;i>=1;i--)
{
cout<<a[i];
}
return 0;
}
第二种实现稍繁,对数据没要求 思路是将乘数的每一位与被除数的每一位错位加,模拟竖式乘法
代码2:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string a,b;
ll c[10000];
int main() {
cin>>a>>b;
ll carry=0,k=0,x=1;
for(ll i=a.size()-1;i>=0;i--)
{
for(ll j=b.size()-1;j>=0;j--)
{
c[k]+=(a[i]-'0')*(b[j]-'0')+carry;
carry=c[k]/10;
c[k]%=10;
k++;
}
c[k]+=carry;//最高位可能有进位
carry=0;
k=x;//错位相加
x++;
}
ll pos;
for(ll i=10000-1;i>=0;i--)
{
if(c[i])
{
pos=i;
break;
}
}
for(ll i=pos;i>=0;i--)
{
cout<<c[i];
}
return 0;
}