原题链接
https://www.acwing.com/problem/content/795/
乘法
题目描述
给定两个整数 A(A>0) 和 B(>=0),请你计算 A×B 的值。
输入格式
共两行,第一行包含整数 A,第二行包含整数 B。
输出格式
共一行,包含 A×B 的值。
数据范围
1≤A的长度≤100000,
0≤B≤10000
输入样例:
2
3
输出样例:
6
思路:
这里是大数乘小数,我们采取的方法是,首先大数的每一位跟小数整体相乘,然后得到的数%10
,即对10取模,即是结果的数,然后除10,就是进位;
代码实现:
#include<iostream>
#include<vector>
using namespace std;
vector<int> mul(vector<int> &A,int b)
{
vector<int> C;
int t=0;//进位
for(int i=0;i<A.size();i++)
{
t += A[i] * b;
C.push_back(t%10);
t /= 10;
}
if(t) C.push_back(t);
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');
if(b)
{
auto c=mul(A,b);
for(int i = c.size()-1;i >= 0;i--)
{
printf("%d",c[i]);
}
}
else printf("%d",0);
return 0;
}
除法
原题链接https://www.acwing.com/problem/content/description/796/
题目描述
给定两个非负整数(不含前导 0) A,B,请你计算 A/B 的商和余数。
输入格式
共两行,第一行包含整数 A,第二行包含整数 B。
输出格式
共两行,第一行输出所求的商,第二行输出所求余数。
数据范围
1≤A的长度≤100000,
1≤B≤10000,
B 一定不为 0
输入样例:
7
2
输出样例:
3
1
思路:
其实数据的存储与之前加法,减法,乘法都是一样的,这里我们要思考怎么进行除。
这里是要保留余数的,余数10+当前的数就是下一步的要处理的数。我们除以这个数;关键点就是余数10+当前数;
代码实现:
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> div(vector<int> &A,int b, int &r)
{
vector<int> C;
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();//除去前导0
return C;
}
int main()
{
string a;
int b;
vector<int> A;
cin>>a>>b;//12345
for(int i=a.size()-1;i>=0;i--)
A.push_back(a[i]-'0');
int r=0; //r采用的是引用参数
vector<int> c = div(A,b,r);
for(int i=c.size()-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
printf("%d",r);
return 0;
}
总结:
1,这里乘法,除法,我们看到就是模拟,所以我们不需要去证明什么,我们只需要去理解,然后记住这种处理技巧;
2,c.push_back()
就类似入栈一样,在后面逐个追加;c.pop_back()
就类似于出栈一样,从后面开始除去;c.back()
返回最后尾元素的值;c.end()
尾元素的下一个位置;