高精度的乘除法

高精度乘低精度

高精度乘低精度模板

// C = A * b, A >= 0, b >= 0
vector mul(vector &A, int b){
    vector C;
    int t=0;
    for(int i=0;i1&&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 
#include 
using namespace std;
// C = A * b
vector mul(vector &A, int b){// b为低精度 
    vector C;//定义答案 C 
    int t = 0;//进位 
    for (int i = 0; i < A.size()||t; i ++) {// A的长度大于 b,遍历 A的长度即可
	// ||t(省代码用的,写一块去了);t!=0,该进位就进位
		//计算当前位乘 b的结果
        if(i 1 && C.back() == 0) C.pop_back();//删除前导 0
    return C;//返回(得到)答案
}
int main() {
    string a;//大数据,以字符串形式保存输入
    int b;//小数据 
    cin >> a >> b;
    vector  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 div(vector &A, int b, int &r){
    vector 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

输出样例:

3 
1

代码:

#include
#include
#include
using namespace std;
// A / b,商是 C,余数是 r 
vector div(vector &A,int b,int &r){//r是引用;取 r的地址符,便于直接对余数 r进行修改
    vector 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 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<


你可能感兴趣的:(c++,算法,图论)