AcWing基础算法学习笔记04——高精度(下)

三、高精度乘法

1.算法思路

步骤一、将乘数A以数组的形式存储,被乘数b为整数类型。

步骤二、用数组A的每一个数去乘b加上进位t,A[i]*b mod10的余数则是该数位的值,将t/10,更新成新的进位。

步骤三、若数组中全为0,只保留一个0.

步骤四、逆向输出数组。

2.代码模板及分析

#include<iostream>
#include<cstring>
#include<algorithm>
#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()||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;
}
int main(){
	string a;
	vector<int> A;
	int b;
	cin>>a>>b;
	for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
	auto C=mul(A,b);
	for(int i=C.size()-1;i>=0;i--){
		cout<<C[i];
	}
	return 0;
}

1.录入数据及处理

    string a;
    vector<int> A;
    int b;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');

        利用ascii码值,将a中的单个字符存入A,b以整数保存

2.乘法处理

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;

        t存储进位值。

        判断条件t不为0,或数组还未遍历完。继续进行乘法操作。

        t+A[i]*b 是第i位乘上b的值,取模则是当前数位i的值,t自身除数则是新的进位

        若结果为0需要消除C中多余的0

四、高精度除法

1.算法思路

步骤一、将被除数以字符串的形式录入,逆序以数组的形式存储,除数以整数的形式录入

步骤二、从最高位开始,余数*10+当前数位,当前位的除数则为余数*10+当前数位除以除数

余数更新为除完当前数位的余数。

步骤三、数组前后顺序交换,去除前位0

步骤四、逆向输出数组

2.代码模板以及解析

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

vector<int> div(vector<int>&A,int b,int &r){
	r=0;
	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();
	return C;
}
int main(){
	string a;
	int b,r;
	cin>>a>>b;
	vector<int>A;
	for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
	auto C=div(A,b,r);
	for(int i=C.size()-1;i>=0;i--)cout<<C[i];
	cout<<endl<<r<<endl;
	return 0;
}

1.录入数据及处理

    string a;
    vector<int> A;
    int b;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');

        利用ascii码值,将a中的单个字符存入A,b以整数保存

2.除法处理

    r=0;
    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();

        r为数组的余数初始化为0,C是返回数组。从被除数的最高位开始,首先余数更新为余数*10加上当前位,将余数除以除数b的值压入数组,r变为除以b后的余数,重复此操作直至遍历完被除数。颠倒前后位置以便删掉多余的前位0。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值