PS:本文章所有代码只考虑两数均为正整数的情况。
一、加法
思路:像小学做竖式加法计算一样,从最低位开始,大于十就进一位。
最关键的点就是int储存不了太长的数,那就要用数组来储存,先输入为字符数组,再将每一个转为整型数组(储存和的数组考虑到最高位的加法可能要进一位,所以和数组的长度要加一)进行加法运算。
别忘了删除和开头多余的零。
代码:
//高精度加法
string s1,s2;
int a[1000]={0},b[1000]={0},c[1001]={0};
cin>>s1>>s2;
int l1=s1.length(),l2=s2.length();
int l3=max(l1,l2)+1;
//转化成int数组
for(int i=0;i<l1;i++)
{
a[i]=s1[l1-i-1]-'0';
}
for(int i=0;i<l2;i++)
{
b[i]=s2[l2-i-1]-'0';
}
//竖式运算
for(int i=0;i<l3;i++)
{
c[i]+=a[i]+b[i];
//大于十要进一位
c[i+1]=c[i]/10;
c[i]%=10;
}
//删掉开头的零
while(c[l3-1]==0)
{
l3--;
}
for(int i=l3-1;i>=0;i--)
{
cout<<c[i];
}
二、减法
思路:按照竖式减法运算,从最高位开始?不,从最低位开始。
主要因为借位,假如百位算完正好是零,十位要借百位的位,那百位就成了-1,这怎么弄,继续让百位向千位借吗?直接从最低位开始不就好了吗?
以及,注意被减数比减数小的情况,标记上负号,然后交换两数,别忘了长度l1、l2也要交换。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
//高精度减法
string s1,s2;
int a[1000]={0},b[1000]={0},c[1001]={0};
cin>>s1>>s2;
int l1=s1.length(),l2=s2.length();
int l3=max(l1,l2);
//判断正负号
int fu=0; //负号则取值为0,且交换两数组
if(l1>l2) fu=1;
else if(l1<l2)
{
swap(s1,s2);
swap(l1,l2);
}
else
{
int i=0;
while(s1[i]==s2[i]&&i<l3) i++;
if(s1[i]>s2[i]) fu=1;
else if(s1[i]<s2[i])
{
swap(s1,s2);
swap(l1,l2);
}
else fu=1;
}
//转化成int数组
for(int i=0;i<l1;i++)
{
a[l1-i-1]=s1[i]-'0';
}
for(int i=0;i<l2;i++)
{
b[l2-i-1]=s2[i]-'0';
}
//竖式运算(从最低位开始)
for(int i=0;i<l3;i++)
{
//借位
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
c[l3-1-i]=a[i]-b[i];
}
//删掉开头的零
int sta=0;
while(c[sta]==0&&sta<l3-1)
{
sta++;
}
if(fu==0)
{
cout<<"-";
}
for(int i=sta;i<l3;i++)
{
cout<<c[i];
}
}
三、乘法
思路:乘法计算时,两个数的第一位相乘,结果是在第一位;第一位和第二位相乘是在第二位;由此,得出了乘法的核心公式: c[i+j]+=a[i]*b[j]
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
//高精度乘法
string s1,s2;
int a[1000]={0},b[1000]={0},c[1001]={0};
cin>>s1>>s2;
int l1=s1.length(),l2=s2.length();
int l3=l1+l2;
//转化成int数组
for(int i=0;i<l1;i++)
{
a[l1-i-1]=s1[i]-'0';
}
for(int i=0;i<l2;i++)
{
b[l2-i-1]=s2[i]-'0';
}
//竖式运算(从最低位开始)
for(int i=0;i<l1;i++)
{
for(int j=0;j<l2;j++)
{
c[i+j]+=a[i]*b[j];
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
}
//删掉开头的零
while(c[l3-1]==0&&0<l3-1)
{
l3--;
}
for(int i=l3-1;i>=0;i--)
{
cout<<c[i];
}
}