算法基本思想及步骤
1.用数组储存大整数,从低位到高位依次存储
2.模拟人工加、减、乘、除法
题目关键点:两数每一位相加、减、乘、除时的中间值的处理
题目
给定两个正整数,计算它们的和。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的和。
数据范围
1≤整数长度≤1000000
输入样例
12
23
输出样例
35
代码
#include
#include
using namespace std;
//C = A + B, 满足A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
vector<int> C; //和储存在C中作为返回值
if (A.size() < B.size()) return add(B, A); //确保A的长度大于B
int t = 0; //设定中间值
for (int i = 0; i < A.size(); i++)
{
t += A[i];
if (i < B.size()) t += B[i]; //两数逐位相加
C.push_back(t % 10); //如果逐位相加的和大于10,将个位输入给C
t /= 10; //逐位相加的和的十位进位给下一位
}
if (t) C.push_back(1); //若最后得到的中间值不为0,则向最高位前进位
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');//利用数字字符减去'0'得到数字储存在数组中
vector<int> C = add(A, B); //求和
for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
cout << endl;
return 0;
}
题目
给定两个正整数,计算它们的差。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤10^6
输入样例
32
11
输出样例
21
代码
#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(); //若A、B长度不相同,则设置if的条件为A.size() > B.size()
for (int i = A.size() - 1; i >= 0; i--)
{
if (A[i] != B[i])
return A[i] > B[i]; //若A、B长度相同但A不等于B,则设置if的条件为A[i] > B[i]
}
return true; //若A、B相等,则if条件为真
}
//C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
vector<int> C; //设定差储存在C中
for (int i = 0, t = 0; i < A.size(); i ++ )
{
t = A[i] - t;
if (i < B.size()) t -= B[i]; //中间值为A的每一位减去上一位运算时借的位,差再减去B的该位的数
C.push_back((t + 10) % 10); //若中间值为负,则将借位后的差存入C,若中间值为正,直接将其存入C
if (t < 0) t = 1; //若中间值为负,将其设为下一位运算时需要减去的借位数1
else t = 0; //若中间值不为负,下一位运算时不需减去借位数,即将中间值设为0
}
while (C.size() > 1 && C.back() == 0) C.pop_back(); //消去C中最高位可能出现的0
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'); //利用数字字符减去'0'得到数字储存在数组中
if (cmp(A, B)) //比较A、B大小设定if条件
{
vector<int> C = sub(A, B); //求差
for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
cout << endl;
}
else
{
vector<int> C = sub(B, A);
cout << "-"; //若A小于B,求B-A的值,在结果前添加负号
for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
cout << endl;
}
return 0;
}
题目
给定两个正整数A和B,请你计算A*B的值。
输入格式
共两行,第一行包含整数A,第二行包含整数B。
输出格式
共一行,包含A*B的值。
数据范围
1≤A的长度≤1000000
1≤B≤10000
输入样例
2
3
输出样例
6
代码
#include
#include
using namespace std;
//C = A * b,满足A >= 0, b > 0
vector<int> mul(vector<int> &A, int b)
{
vector<int> C; //设定乘积储存在C中
int t = 0; //设定中间值
for (int i = 0, t = 0; i < A.size() || t; i ++ ) //设定只要进位不为0就继续循环,包含最高位向前进位
{
if (i < A.size()) t += A[i] * b; //中间值为A的上一位与b相乘向前进位的值加上A的当前位数与b相乘的值
C.push_back(t % 10); //将中间值的个位存入C
t /= 10; //中间值删去个位,设定为需要进的位
}
while (C.size() > 1 && C.back() == 0) C.pop_back(); //消去C中最高位可能出现的0
return C;
}
int main()
{
string a; //将长整数保存在字符数组中
int b;
cin >> a >> b;
vector<int> A;
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');//利用数字字符减去'0'得到数字储存在数组中
vector<int> C = mul(A, b); //求乘积
for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
cout << endl;
return 0;
}
题目
给定两个正整数A,B,请你计算A/B的商和余数。
输入格式
共两行,第一行包含整数A,第二行包含整数B。
输出格式
共两行,第一行输出所求的商,第二行输出所求余数。
数据范围
1≤A的长度≤1000000
1≤B≤10000
输入样例
7
2
输出样例
3
1
代码
#include
#include
#include
using namespace std;
//A / b, 商是C,余数是r
vector<int> div(vector<int> &A, int b, int &r)
{
vector<int> C; //设定商储存在C中
r = 0;
for (int i = A.size() - 1; i >= 0; i -- ) //除法从高位向低位运算
{
r = r * 10 + A[i]; //中间值为上一位除完所得余数乘以10加上该位数
C.push_back(r / b); //将中间值除以b所得的商存入C中
r %= b; //中间值除以b所得的余数用于下一级运算
}
reverse(C.begin(), C.end()); //反转C中数的顺序得到商
while (C.size() > 1 && C.back() == 0) C.pop_back(); //消去C中最高位可能出现的0
return C;
}
int main()
{
string a; //将长整数保存在字符数组中
int b;
cin >> a >> b;
vector<int> A;
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); //利用数字字符减去'0'得到数字储存在数组中
int r;
vector<int> C = div(A, b, r); //求商和余数
for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
cout << endl << r << endl;
return 0;
}
(模板来源于AcWing用户yxc)