高精度計算的方法:
1:先用字元串進行輸入,并用向量對其逆序轉化位數字
2:模拟四則運算法則對其進行計算;
3:倒序輸出
以下是高精度計算的代碼,希望對小夥伴有所幫助!!!
函數1:計算高精度加法;( a + b )
函數2:計算高精度減法;( a - b )
函數3:計算高精度乘法;( a * b )
函數4:計算高精度除法;( a / b )
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
vector<int> a , b , C , D , E , F ;
string A , B ;
void input()
{
cin >> A >> B ;
for( int i = A.size() - 1 ; i >= 0 ; i -- )
{
a.push_back(A[i] - '0' ) ; //将一個個字元逆序轉化為數字并存入向量a中;
}
for( int i = B.size() - 1; i >= 0 ; i -- )
{
b.push_back(B[i] - '0' ) ; //将一個個字元逆序轉化為數字并存入向量b中;
}
}
void print( vector <int> s )
{
while( s.size() > 1 && s.back() == 0 )
{
s.pop_back() ; //去除前導0操作(s的最高位很有可能會出現前導0,我們必須對前導0删除)
}
for( int i = s.size() - 1 ; i >= 0 ; i --)
{
cout << s[i] ; //對值逆序輸出
}
cout << endl ;
}
bool cmp( vector <int> a , vector <int > b )
{
if( a.size() != b.size() )
{
return ( a.size() > b.size() ) ; //如果 a 的位數 大于b 的位數 , 則傳回真;如果b的位數更大,則傳回假
}
else
{
for( int i = a.size() - 1 ; i >= 0 ; i --) //如果兩個位數相等,則從最高位進行比較,如果一直相等,那就繼續往後移位比
{
if( a[i] != b[i] )
{
return ( a[i] > b[i] ) ; //如果滿足表達式,值就為真,代表a大于b;
}
}
}
return true ; //如果兩個數的位數及其每一位都相等,那麼這兩個數就相等
}
vector <int> func1(vector <int> a , vector <int> b) //函數1,做高精度加法
{
int t = 0 ; //記錄是否進位
int i = 0 ; //記錄加的值
while( i < a.size( ) || i < b.size() )
{
if( i < a.size( ) ) t += a[i] ; //如果i小于a的位數,那麼a[i]應該加入到t中
if( i < b.size( ) ) t += b[i] ; //同理,如果i小于b的位數,那麼b[i]應該也加入到t中
C.push_back( t % 10 ) ; //把t的各位放入C中
t /= 10 ; //t的進位記錄下來
i ++ ; //a 與 b 的位數往後移
}
if( t )
{
C.push_back( t ) ; //如果還有一個進位并沒有加入C中,則應加入進去;
}
return C ; //傳回C ;
}
vector <int> func2(vector <int> a, vector <int > b)
{
if (cmp(a, b)) //cmp是比較a與b大小的函數,如果a>=b,那麼輸出的值是正數,否則輸出的值是負數
{
int t = 0;
for (int i = 0; i < a.size(); i++)
{
t = a[i] - t;
if (i < b.size()) t -= b[i];
D.push_back((t + 10) % 10);
if (t < 0) t = 1;
else t = 0;
}
}
else
{
cout << "-"; //因為 b > a , 是以計算結果是負數,我們隻需要輸出負号,并且計算 b - a ;
int t = 0;
for (int i = 0; i < b.size(); i++)
{
t = b[i] - t;
if (i < a.size()) t -= a[i];
D.push_back((t + 10) % 10);
if (t < 0) t = 1;
else t = 0;
}
}
return D;
}
vector <int> func3( vector <int> a , vector <int> b ) //a的位數是在1 ~ 1e6 , 而 b 的值在 1 ~ 100000 之間;
{
int m = 0 ;
for( int i = b.size() - 1 ; i >= 0 ; i -- )
{
m = m * 10 + b[i] ; // 把b 轉化成一個整數 ;
}
int t = 0 ;
for( int i = 0 ; i < a.size( ) ; i ++ )
{
t += a[i] * m ; // 把 m 當作一個整體,用a的每一位對其相乘,再加上之前按的進位;
E.push_back( t % 10 ) ; // 取出 t 的個位加入到E中
t /= 10 ; // t 進位後再加入下一個值當中;
}
if( t )
{
E.push_back( t ) ; // 如果 t 還有 進位 , 那麼則應該加入到E中;
}
return E ; // 傳回 E ;
}
vector <int> func4(vector <int> a,vector <int> b) //a的位數是在1 ~ 1e6 , 而 b 的值在 1 ~ 100000 之間;
{
int m = 0 , t = 0 ;
for( int i = b.size() - 1 ; i >= 0 ; i -- )
{
m = m * 10 + b[i] ; // 把b 轉化成一個整數 ;
}
for( int i = a.size() - 1 ; i >=0 ; i -- )
{
t = t * 10 + a[i] ; // t 記錄 目前的值
F.push_back( t / m ) ; // 把 t 除以 m 進行儲存;
t %= m ; // t 對 m 的模 儲存進入 下次計算 ;
}
reverse( F.begin() , F.end() ) ;
return F ;
}
int main()
{
input() ; // 輸入a與b;
C = func1( a , b ) ; //記錄加法的值 ;
D = func2( a , b ) ; //記錄減法的值 ;
E = func3( a , b ) ; //記錄乘法的值 ;
F = func4( a , b ) ; //記錄除法的值 ;
print(C) ; //輸出加法的值 ;
print(D) ; //輸出減法的值 ;
print(E) ; //輸出乘法的值 ;
print(F) ; //輸出除法的值 ;
return 0 ; //主函數傳回值 ;
}