四 个 模 板 均 是 基 于 正 整 数 之 间 的 操 作 , 若 出 现 负 数 , 可 以 通 过 符 号 的 添 加 来 转 化 到 正 整 数 上 来 。 四个模板均是基于正整数之间的操作,若出现负数,可以通过符号的添加来转化到正整数上来。 四个模板均是基于正整数之间的操作,若出现负数,可以通过符号的添加来转化到正整数上来。
数 组 A 和 数 组 B 按 照 低 位 在 前 , 高 位 在 后 , 将 两 个 大 数 存 储 起 来 。 ( 原 因 是 在 数 组 的 末 尾 添 加 数 字 方 便 进 位 ) 。 模 拟 笔 算 加 法 , 借 助 一 个 进 位 标 记 即 可 。 数组A和数组B按照低位在前,高位在后,将两个大数存储起来。(原因是在数组的末尾添加数字方便进位)。\\模拟笔算加法,借助一个进位标记即可。 数组A和数组B按照低位在前,高位在后,将两个大数存储起来。(原因是在数组的末尾添加数字方便进位)。模拟笔算加法,借助一个进位标记即可。
代码:
#include
#include
#include
using namespace std;
vector<int> add(vector<int> &A,vector<int> &B)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size()||i<B.size();i++)
{
if(i<A.size()) t+=A[i];
if(i<B.size()) t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t) C.push_back(t);
return C;
}
int main()
{
string a,b;
vector<int> A,B;
cin>>a>>b;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
auto C=add(A,B);
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
cout<<endl;
return 0;
}
同 加 法 类 似 , 需 要 注 意 的 是 : ① 、 用 大 数 建 小 数 , 再 考 虑 是 否 需 要 添 加 负 号 。 ② 、 第 i 位 的 值 为 A [ i ] − B [ i ] − t ( t 是 借 位 标 志 , 若 A 被 前 一 位 借 位 , 那 么 t = 1 , 否 则 t = 0 ) 。 若 t > = 0 , 直 接 减 得 到 结 果 , 否 则 将 t + 10 ( 借 位 借 来 的 10 ) , 总 结 起 来 , 这 个 结 果 为 ( t + 10 ) % 10 。 ③ 、 要 去 除 前 导 0 。 同加法类似,需要注意的是:\\ \ \\①、用大数建小数,再考虑是否需要添加负号。\\②、第i位的值为A[i]-B[i]-t(t是借位标志,若A被前一位借位,那么t=1,否则t=0)。\\\qquad若t>=0,直接减得到结果,否则将t+10(借位借来的10),总结起来,这个结果为(t+10)\%10。\\③、要去除前导0。 同加法类似,需要注意的是: ①、用大数建小数,再考虑是否需要添加负号。②、第i位的值为A[i]−B[i]−t(t是借位标志,若A被前一位借位,那么t=1,否则t=0)。若t>=0,直接减得到结果,否则将t+10(借位借来的10),总结起来,这个结果为(t+10)%10。③、要去除前导0。
代码:
#include
#include
#include
using namespace std;
//A>=B ?
bool cmp(vector<int> &A,vector<int> &B)
{
if(A.size()!=B.size()) return A.size()>B.size();
for(int i=A.size()-1;i>=0;i--)
if(A[i]!=B[i])
return A[i]>B[i];
return true;
}
vector<int> sub(vector<int> &A,vector<int> &B)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size();i++)
{
t=A[i]-t;
if(i<B.size()) t-=B[i];
C.push_back((t+10)%10);
if(t<0) t=1;
else t=0;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main()
{
string a,b;
vector<int> A,B;
cin>>a>>b;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
vector<int> C;
if(cmp(A,B)) C=sub(A,B);
else C=sub(B,A),cout<<"-";
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
cout<<endl;
return 0;
}
与 加 法 类 似 , 这 里 是 一 个 高 精 度 × 低 精 度 的 模 板 , 就 是 数 组 A × 整 型 数 B 。 模 拟 竖 式 计 算 , 但 是 把 整 数 B 看 作 一 个 整 体 , 第 i 位 的 值 为 A [ i ] × B + t ( 进 位 ) 。 与加法类似,这里是一个高精度×低精度的模板,就是数组A×整型数B。\\模拟竖式计算,但是把整数B看作一个整体,\\第i位的值为A[i]×B+t(进位)。 与加法类似,这里是一个高精度×低精度的模板,就是数组A×整型数B。模拟竖式计算,但是把整数B看作一个整体,第i位的值为A[i]×B+t(进位)。
代码:
#include
#include
#include
using namespace std;
vector<int> mul(vector<int> &A,int B)
{
vector<int> C;
int t=0;
for(int i=0;i<A.size()||t;i++)
{
t+=A[i]*B;
C.push_back(t%10);
t/=10;
}
if(t) C.push_back(t);
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main()
{
string a;
int B;
vector<int> A;
cin>>a>>B;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
auto C=mul(A,B);
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
cout<<endl;
return 0;
}
同 乘 法 类 似 , 需 要 注 意 的 是 : ① 、 模 拟 除 法 的 过 程 中 , 是 从 高 位 向 低 位 进 行 计 算 的 。 ② 、 需 要 去 除 前 导 零 , 去 除 之 前 别 忘 了 高 低 位 翻 转 。 同乘法类似,需要注意的是:\\①、模拟除法的过程中,是从高位向低位进行计算的。\\②、需要去除前导零,去除之前别忘了高低位翻转。 同乘法类似,需要注意的是:①、模拟除法的过程中,是从高位向低位进行计算的。②、需要去除前导零,去除之前别忘了高低位翻转。
代码:
#include
#include
#include
#include
using namespace std;
vector<int> div(vector<int> &A,int B,int &r)
{
vector<int> C;
r=0;
for(int i=A.size()-1;i>=0;i--)
{
r=r*10+A[i];
C.push_back(r/B);
r%=B;
}
reverse(C.begin(),C.end());
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main()
{
string a;
vector<int> A;
int B;
cin>>a>>B;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
int r;
auto C=div(A,B,r);
for(int i=C.size()-1;i>=0;i--) cout<<C[i];
cout<<endl<<r<<endl;
return 0;
}