信息学奥赛一本通(C++版)在线评测系统
1169:大整数减法
同学们,今天我们要学习的内容是大整数减法,这可是个很厉害的本领哦!就像我们之前做减法一样,只不过今天的数字超级大,普通的方法可算不出来呢。别担心,跟着老师一步一步来,大家肯定都能学会!
一、解题思路
同学们,我们平常做减法,比如5 - 3,是不是一下子就能算出答案啦?但今天要做的大整数减法,数字特别大,没办法直接算出来。这时候,我们可以像平时写减法竖式那样来解决它。把两个大整数像排队一样,个位和个位对齐,十位和十位对齐,百位和百位对齐……一直到最后一位都对齐。然后从最右边的个位开始减起,如果个位上的数字不够减,就像以前学的那样,向十位借1,这个借的1呀,到了个位就变成10啦,加上原来个位的数字再去减。按照这样的方法,从个位开始,一位一位地减,最后就能得到两个大整数相减的结果啦。
二、解题步骤
- 输入数字:我们要先把题目里的两个大整数找出来,就像找到两个要比赛的队伍一样。然后,把它们输入到我们的“数学小助手”(电脑程序)里。
- 数位对齐并补0:看看这两个大整数的位数是不是一样多。如果不一样多,位数少的那个大整数前面要补0,一直补到和位数多的大整数位数一样。比如说,一个大整数是123,另一个是45,那45前面就要补一个0,变成045,这样它们就都是三位数啦,就对齐啦。
- 从个位减起:现在两个队伍站整齐啦,我们从最后一个小朋友(个位)开始减。看看前面队伍个位的小朋友数量减去后面队伍个位的小朋友数量够不够减。要是够减,就直接相减;要是不够减,就从前面一位借1个小朋友(借1当10),加上原来个位的小朋友数量再减。
- 依次计算其他数位:算完个位,接着算十位。计算十位的时候方法和个位一样哦,如果不够减还是要借位。然后是百位、千位……一直这样算到最高位。
- 去除前导0:算完之后,结果的最前面可能会有一些0,这些0就像多余的“小尾巴”,我们要把它们去掉,只留下有用的数字。比如说结果是00123,我们就把前面两个0去掉,变成123。
- 得出结果:把去掉前导0后的数字写出来,这就是两个大整数相减的结果啦。
三、C++代码实现
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a, b;
cin >> a >>b;
bool fs = false; //负数标志
//int len = max(a.size(),b.size()); //最长的长度
int len=a.size();
vector<int> c(len+1,0); // 借位动态数组c:初始标志为0,表示每位每位的被减数未存在借位,
// 1.补齐长度
/*
while (a.size() < len)
{
a = "0" + a;
}
*/
while (b.size() < len)
{
b = "0" + b;
}
//2.判断正负数
/*
if(a<b)
{
swap(a,b); //交换值,用大数-小数
fs=true;
}
*/
string res = "";
int jw = 0; //借位
// 从后往前逐位相减
for (int i = len - 1; i >= 0; i--)
{
int n1 = a[i] - '0' ;
int n2 = b[i] - '0';
n1 = n1 - c[i]; //减去当前借位
if (n1 < n2 )
{
n1 += 10; //向下一高位借1当10
c[i-1] = 1; //下一高位 标识 被借位1
}
int sub= n1 - n2 ;
res = char(sub + '0') + res;
}
// 去除前导0
// 结果为0 ,不删除前导0
while (res.size() > 1 && res[0] == '0')
{
res.erase(0, 1);
}
// 处理负数情况
if (fs)
{
res = "-" + res;
}
cout << res << endl;
return 0;
}
四、知识点总结
- 数位对齐:数位对齐是大整数减法的基础,只有让两个大整数的相同数位对齐,才能正确地进行每一位的减法计算。就像两个队伍比赛,小朋友们得站在对应的位置上才能公平比赛。
- 补0操作:当两个大整数位数不同时,在位数少的大整数前面补0,使它们位数相同,这样方便我们逐位相减。这就像是给短队伍加上一些“假装的小朋友”,让两个队伍一样长。
- 借位:在减法计算中,如果某一位上的数字不够减,就要从前一位借1当10。借位是大整数减法的关键步骤,同学们一定要理解并记住这个规则哦。
- 字符串的使用:因为大整数太大,普通的数字类型存不下,所以我们用字符串来存储大整数。在程序里,我们要学会把字符串里的字符变成数字进行计算,算完后再把数字变回字符存到结果字符串里。还要掌握获取字符串长度、在字符串前面添加字符、删除字符串字符等操作。
- 循环和条件判断:
for
循环可以帮助我们按顺序处理大整数的每一位数字,if - else
条件判断能让我们知道每一位上的数字够不够减,需不需要借位。它们是编程里很重要的工具,以后还会经常用到呢。