天天看點

高精度計算總結(加減乘除)

高精度計算的方法:

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           ; //主函數傳回值 ;
}
           

繼續閱讀