标签:792 -- back int vector push 减法 AcWing size
算法思路
与高精度加法大致相同,同样运用了“列竖式”的思想。
当然,加法中的“进位操作”要改成减法中的“退位操作”。
具体过程如下:
- 从最低位开始,用被减数的这一位减去减数的这一位;
- 判断是否构够减,若不够减(即减数的这一位大于被减数的这一位),则向高一位借一(被减数高一位减一,当前位加十);
- 重复以上操作。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
bool cmp(vector<int> &a, vector<int> &b) //比大小,a大于等于b返回true,否则返回false
{
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;
for (int i = 0, t = 0; i < a.size(); i ++ )
{
if (i < b.size()) //减数是否还能继续减
{
if (a[i] >= b[i]) //够减
{
c.push_back(a[i] - b[i]);
}
else //不够减,借位
{
c.push_back(a[i] + 10 - b[i]);
a[i + 1] -- ;
}
}
else
{
if (a[i] >= 0)
{
c.push_back(a[i]);
}
else //借位
{
c.push_back(a[i] + 10);
a[i + 1] -- ;
}
}
}
while (c.size() > 1 && c.back() == 0) //处理前导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');
}
if (cmp(A, B)) //减数比被减数小(答案为正数)
{
auto C = sub(A, B);
for (int i = C.size() - 1; i >= 0; i -- )
{
cout << C[i];
}
}
else //减数比被减数大(答案为负数)
{
auto C = sub(B, A);
printf("-");
for (int i = C.size() - 1; i >= 0; i -- )
{
cout << C[i];
}
}
return 0;
}
\(\text {Python}~yyds\)!
print(input() - input())
标签:792,--,back,int,vector,push,减法,AcWing,size 来源: https://www.cnblogs.com/FXT1110011010OI/p/16528602.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。