高精度乘低精度
高精度乘低精度模板
// C = A * b, A >= 0, b >= 0
vector<int> mul(vector<int> &A, int b){
vector<int> C;
int t=0;
for(int i=0;i<A.size()||t;i++){
if(i<A.size()) t+=A[i]*b;
C.push_back(t%10);
t/=10;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
高精度乘低精度模板题 AcWing 793. 高精度乘法
793. 高精度乘法
给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。
输入格式
共两行,第一行包含整数 A,第二行包含整数 B。
输出格式
共一行,包含 A×B 的值。
数据范围
1≤A的长度≤100000,
0≤B≤10000
输入样例:
2 3
输出样例:
6
代码:
#include <iostream>
#include <vector>
using namespace std;
// C = A * b
vector<int> mul(vector<int> &A, int b){// b为低精度
vector<int> C;//定义答案 C
int t = 0;//进位
for (int i = 0; i < A.size()||t; i ++) {// A的长度大于 b,遍历 A的长度即可
// ||t(省代码用的,写一块去了);t!=0,该进位就进位
//计算当前位乘 b的结果
if(i<A.size()) t += A[i] * b;//省代码这种很少能一全两美,还得另外追加条件(保证是所求数据)
//解释:( ||t及 if(i<A.size())其实也是防止超位的数未加)
C.push_back(t % 10); //向 C压入 t进位后的数(取个位)
t /= 10; //进位
}
//考虑 b=0的情况
while (C.size() > 1 && C.back() == 0) C.pop_back();//删除前导 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');// a[i]-'0':字符转数字
auto C = mul(A, b);//高精度乘低精度
for (int i = C.size() - 1; i >= 0; i --) printf("%d",C[i]);
return 0;
}
高精度除以低精度
高精度除以低精度模板
// A / b = C ... r, A >= 0, b > 0
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;
}
高精度除以低精度模板题 AcWing 794. 高精度除法
794. 高精度除法
给定两个非负整数(不含前导 0) A,B ,请你计算 A/B 的商和余数。
输入格式
共两行,第一行包含整数 A,第二行包含整数 B。
输出格式
共两行,第一行输出所求的商,第二行输出所求余数。
数据范围
1≤A的长度≤100000,
1≤B≤10000,
B 一定不为 0
输入样例:
7 2
输出样例:文章来源:https://www.toymoban.com/news/detail-419256.html
3 1
代码:文章来源地址https://www.toymoban.com/news/detail-419256.html
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
// A / b,商是 C,余数是 r
vector<int> div(vector<int> &A,int b,int &r){//r是引用;取 r的地址符,便于直接对余数 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);//往 C中压入商(用余数整除 b)
r%=b;//更新余数
}
//除法是从高位向低位运算,而 C的前导 0都在 vector的头部而不是尾部,
//(是尾部的话可以直接用 C.pop_back()函数删除前导 0)
//便于操作(其实就是想直接用函数来处理(摸鱼)),我们可以把 C翻转,
//这样 0就位于 vector的尾部,使用 pop函数删除前导 0
reverse(C.begin(),C.end());//翻转数组
while(C.size()>1&&C.back()==0) C.pop_back();//删除前导 0
return C;//返回(得到)答案
}
int main(){
string a;//大数据
int b;//小数据,b为低精度
cin>>a>>b;
vector<int> A;
//从高位到低位处理(用逆序遍历)
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--) printf("%d",C[i]);//将 C从最高位传给最低位
cout<<endl<<r<<endl;//输出余数
return 0;
}
到了这里,关于高精度的乘除法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!