适用范围:超出long long级别的运算
本质:逆序存储数据,模拟现实运算
为什么要逆序存储:理由很简单,便利于进位和借位。
需要处理好的问题:进位,借位,以及输出问题(容易遗漏项)
加法(要求输入都是正数)
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
int a1[1001];
int a2[1001];
int a3[1001];//用于高精位的加法,处理好进位即可
int main()
{
cin>>s1>>s2;
for(int i=1;i<=s1.size();i++)//逆序存储
a1[i]=s1[s1.size()-i]-'0';
for(int i=1;i<=s2.size();i++)
a2[i]=s2[s2.size()-i]-'0';
int p=0;
for(int i=1;i<=max(s1.size(),s2.size());i++)
{
a3[i]+=a1[i]+a2[i];//进位后的a3[i]有值,得+=
a3[i+1]+=a3[i]/10;//这里也可以是直接等于,不影响
a3[i]=a3[i]%10;
p=i;
}
while(a3[p+1]>0)//防止漏项
p++;
for(int i=p;i>0;i--)
cout<<a3[i];
减法(前者比后者大)
for(int i=1;i<=max(s1.size(),s2.size());i++)
{
a4[i]+=a1[i]-a2[i];
if(a4[i]<0)
a4[i]+=10,a4[i+1]=-1;//一次仅能借一位
}
int len=max(s1.size(),s2.size());
while(len>1&&a4[len]==0)//len得要大于1,否则两数相等时没有输出,看下一个循环
len--;
for(int i=len;i>0;i--)
cout<<a4[i];
改进后的减法(都为正数,但是大小顺序不行)
思想:说白了还是让大减去小的,加个判断条件即可
#include<iostream>
#include<string>
using namespace std;
string s1,s2;
int a1[10005]={0},a2[10005]={0},a3[10005]={0};
bool check(string a,string b)
{
if(a.size()>b.size())return true;
else if(a.size()<b.size())return false;
else return a>=b?true:false;
}
int main()
{
cin>>s1>>s2;
if(check(s1,s2))
{
for(int i=1;i<=s1.size();i++)
a1[i]=s1[s1.size()-i]-'0';
for(int i=1;i<=s2.size();i++)
a2[i]=s2[s2.size()-i]-'0';
}
else
{
for(int i=1;i<=s2.size();i++)
a1[i]=s2[s2.size()-i]-'0';
for(int i=1;i<=s1.size();i++)
a2[i]=s1[s1.size()-i]-'0';
}
for(int i=1;i<=max(s1.size(),s2.size());i++)
{
a3[i]+=a1[i]-a2[i];
if(a3[i]<0)a3[i]+=10,a3[i+1]=-1;
}
int p=max(s1.size(),s2.size());
while(p>0&&a3[p]==0)p--;
if(!check(s1,s2))cout<<'-';
for(int i=p;i>0;i--)
cout<<a3[i];
return 0;
}
乘法:
主要思想:双循环实现进位即可
代码如下:
void multiply()
{
for(int i=1;i<=s1.size();i++)
for(int j=1;j<=s2.size();j++)
{
b[i+j-1]+=a1[i]*a2[j];
if(b[i+j-1]>=10)
{
b[i+j]+=b[i+j-1]/10;//这里必须为+=,不然可能会覆盖之前的值
b[i+j-1]%=10;
}
}
int p=min(s1.size(),s2.size());
for(int i=p;i<=s1.size()+s2.size();i++)//容易得知,任意大的两正整数相乘的值得位数比小于等于两操作数的位数之和
if(b[i]>0)p=i;
for(int i=p;i>0;i--)
cout<<b[i];
}
除法的部分以后再补充(除法不太常用)
如有错误,欢迎再下方指出
邮箱:2252578955@qq.com