大整數 減法

2021-07-16 18:45:41 字數 1907 閱讀 6159

本文主要給出大數減法的一般思路。關於大數的一般性闡述可以參看大整數-加法-demo這篇部落格。

基本來說,還是大整數的那套思路。

要進行處理的數字,超過了計算機語言所能提供型別的最大範圍。只能自己寫陣列儲存每一位數字。由於不是內建型別,所以沒有相應操作的支援。只能自己寫,人工模擬減法操作。

當然,具體寫的時候,減法和加法還是有一些區別。下面這些點需要注意:

首先,減法需要判斷大小。只能是大數 - 小數的時候才能用上面的規則,也就是說對於 2 - 8這種型別應該先計算 8 - 2 = 6, 然後再加上負號,得到-6。

其次,輸出的時候存在前導0的情形。用string實現,加法不存在前導0的情形,直接依次輸出就行。減法輸出的時候,不行。可能存在前導0的原因是因為,減法如果不減到最高位,你是不知道之前的這些0是前導0還是中間的0.只要最高位計算完畢之後你才知道。

我在寫的時候由於是用string型別來儲存大整數,所以在比較兩個數大小的時候相對簡單一點。如果數字相同的時候可以直接比較。但是,我之前忽略了一點就是,當數字不相同的時候,這種情形也是需要考慮的。比如66 - 8。如果直接用字串比較,肯定會得到錯誤的結果。

/* 

input:

多組輸入資料; 字串組織;

process:

1.讀入a,b;

2.判斷:如果 a < b, 交換a與b的值

3.計算a_sz, c = 0;

3.迴圈:i < a_sz

3.1.先累加:left = a[i] + c;

3.2.判斷:i < b_sz

3.2.1.true, right = b[i]

3.2.2.false, right = 0;

3.3.判斷:left >= right

3.3.1.true,夠減,計算當前位 left - right; c = 0;

3.3.2.flase, 不夠減,計算當前位 left + 10 - right; c = - 1;

4.返回ret

output:

測試資料:

66 9

1 288 5

2 999999999999

456786798787 4564564857921456645789789

*/#include

#include

#include

#define local

std::string bign_minus( const

std::string& a, const

std::string& b );

int main( void )

std::string ret = bign_minus( std::string(a.rbegin(), a.rend()), std::string(b.rbegin(), b.rend()) );

int sz = ret.size();

int i = 0;

for( i = sz - 1; ret[i] == '0'; --i );

if(!flag)

std::cout

<< '-';

for( int j = i; j >= 0; --j )

std::cout

<< ret[j];

std::cout

<< std::endl;

}#ifdef local

cin.close();

#endif

return0;}

std::string bign_minus( const

std::string& a, const

std::string& b )

else

}return ret;

}

大整數減法

include stdafx.h include substr.h includeusing namespace std define max lenth 201 void sub int len,int bignuma,int bignumb printf d n 10 bignuma 0 els...

大整數減法

求兩個大的正整數相減的差。共2行,第1行是被減數a,第2行是減數b a b 每個大整數不超過200位,不會有多餘的前導零。一行,即所求的差。跟加法一樣,從後向前按位減法,不夠減則向前借位。include include define max 202 最高位為200 int main for j 0 ...

大整數減法

本篇介紹大整數相減 兩個正數相減 與大整數加法運算相比,減法運算稍微複雜了些,因為要考慮當結果為負數時候的情況。根據減法運算法則可以得出兩個整數相減為正數的情況。這樣想來,只需要在兩個正的大整數相減前比較大小即可得出另外一種情況。例 所以最終功能的實現由以下部分組成 逆序存放數字 對齊整數的個位,便...