C++算法——高精度运算

(1)高精度加法

主要思路:(1)将字符串中的各个元素取出并转换成整形——主要是vector这个变量在操作

(2)将各个数值从低位取出并逐个进行运算,由于两个大整数的长度不同,因此要进行一系列处理。通常是设置一个进位数t。

#include<vector>
// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)  //加引用可以增加效率
{
    
    
    if (A.size() < B.size()) return add(B, A); //进行判断,将保证大数是 A ,小数是 B

    vector<int> C; //建立结果
    int t = 0; //设置一个进位t
    for (int i = 0; i < A.size(); i ++ )
    {
    
    
        t += A[i]; //t加上当前的 A 中的第 i 位
        if (i < B.size()) t += B[i]; //判断小数B是否加完,没有就加上
        C.push_back(t % 10); //加上 t 的10余数
        t /= 10; //此时t变成下一个的进位
    }

    if (t) C.push_back(t);
    return C;
}

作者:yxc!!!
链接:https://www.acwing.com/blog/content/277/!!!
来源:AcWing!!!
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。!!!

(2)高精度减法

高精度减法其实与高精加法类似,对于进位有特殊的处理方式,同时对输出数,如:003,要转化为3.

在这里插入图片描述

#include<iostream>
#include<vector>

using namespace std;

//这里是比较大小,如果B > A ,将A 和 B 的顺序调换,这样方便进行减法运算
bool cmp( vector<int> &A , vector<int> &B )
{
    
    
	if( A.size() != B.size() ) return A.size() > B.size();
	
	else
	{
    
    
		for( int i = A.size() - 1; i>= 0; i-- )
			if( A[i] != B[i] ) return A[i] > B[i];
	}
	
	return true;
}

vector<int> sub( vector<int> &A , vector<int> &B ) 
{
    
    
	vector<int> C;
	
	for( int i = 0 , t = 0 ; i < A.size() ; i++ ) //t充当结为数
	{
    
    
		t = A[i] - t ;
		if( i < B.size() ) t -= B[i];
		C.push_back( ( t + 10 ) % 10 ); //这一步加10主要是防止是负数的情况,即要向前借位。
		
		if( t < 0 ) t = 1;
		else t = 0;
	}
	
	while( C.size() > 1 && C.back() == 0 ) C.pop_back();
	
	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');//这里使用vector将字符串变			   //成整形并存入A这个vector数组中
	for( int i = b.size() - 1 ; i>=0 ; i-- ) B.push_back( b[i] - '0');
	
	
	if( cmp( A , B ))
	{
    
    
		auto C = sub( A , B );
		
		for( int i = C.size() - 1 ; i>= 0 ; i-- ) cout<<C[i];
	 }
	 else
	 {
    
    
	 	auto C = sub( B ,A );
		
		cout<<"-";
		for( int i = C.size() - 1 ; i>= 0 ; i-- ) cout<<C[i];
	 }
}
作者:yxc!!!
链接:https://www.acwing.com/blog/content/277/!!!
来源:AcWing!!!
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。!!!

(3)高精度乘法乘低精

在这里插入图片描述

#include<iostream>
#include<vector>

using namespace std;

vector<int> mul( vector<int> A , int b )
{
    
    
	int t = 0;
	vector<int> C;
	
	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;
	
	int b;
	
	cin>>a>>b;
	
	vector<int> C,A;
	
	for( int i = a.size() - 1 ; i >= 0 ; i-- ) A.push_back( a[i] - '0' );
	
	C = mul( A , b );
	
	for( int i = C.size() - 1 ; i>= 0; i-- ) cout<<C[i];
}

(4)高精度除法除低精

在这里插入图片描述

#include<iostream>
#include<vector>
#include<algorithm>


using namespace std;

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;
} 

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

猜你喜欢

转载自blog.csdn.net/MrChen666/article/details/108590841