减法
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+10;
int la,lb;
int r[N];
string a,b;
int main()
{
cin>>a>>b;
la=a.size()-1,lb=b.size()-1;
if(la<lb || (la==lb && a<b))
{
cout<<'-';
swap(a,b);
swap(la,lb);
}
if(a==b)
{
cout<<"0\n";
return 0;
}
int u=0;
memset(r,0,sizeof r);
while(la>=0 && lb>=0)
{
r[u]=r[u]+(a[la]-'0')-(b[lb]-'0');
if(r[u]<0)
{
r[u+1]--; //这里r[u]本身就是负数,借位10过来刚好是相加
r[u]=10+r[u]; //同时因为前边已经做了交换,string a是大值,所有最后不用判断最高位是否为负
}
u++;
la--;
lb--;
}
while(la>=0)
{
r[u]=r[u]+(a[la]-'0');
if(r[u]<0)
{
r[u+1]--;
r[u]=10+r[u];
}
u++;
la--;
}
while(u>=0 && r[u]==0) u--; //如果前边不特判a==b输出0的话,这里就要注意应该u--到 u>=1 这样才能保留最后一位0
while(u>=0)
{
cout<<r[u];
u--;
}
return 0;
}
乘法
#include<bits/stdc++.h>
using namespace std;
int r[100000];
int c[100000],d[100000];
int main()
{
string a,b;
cin>>a>>b;
int la=a.size()-1,lb=b.size()-1;
int i,j;
for(i=la,j=0;i>=0;i--,j++) c[j]=a[i]-'0';
for(i=lb,j=0;i>=0;i--,j++) d[j]=b[i]-'0';
for(i=0;i<=la;i++)
{
for(j=0;j<=lb;j++)
{
r[i+j] += c[i]*d[j];
}
}
/*
我们再声明一个数组c来储存答案。大家通过一个简单的乘法运算进行模拟就可以看出,以同样的储存规则,a[0] * b[0] = c[0]; a[0] * b[1] + a[1] * b[0] = c[1];逐渐我们可以发现规律: "c[i + j] += a[i] * b[j]"同过一个循环去实现,就可以把c[i + j]计算出来,需要指出的是,这里的计算我们还没有进行进位处理。
1 2 3
* 5 6 7
*--------------------------
7 14 21
6 12 18
5 10 15
*--------------------------
5 16 34 32 21
*/
for(i=0;i<=la+lb+2;i++)
{
if(r[i]>9)
{
r[i+1]+=r[i]/10;
r[i]%=10;
}
}
while(r[i]==0&&i>0) i--;//i>=0的话 0*0得不出结果
for(j=i;j>=0;j--)
cout<<r[j];
return 0;
}