題目:輸入兩個正整數num1,num2。(0在前面的大整數的加法裡已經分析過(大整數的四則運算----加法),所以話不多說,直接上重點。還是對應位之間的運算,但是減法不同於加法,加法具有交換律,所以兩個數哪個在前哪個在後都無所謂。但減法卻不行,所以為了計算,我們首先要知道num1,num2到底哪個大?所以需要乙個比較函式,如下。
code:
int
compare
(string s1, string s2)
//s1>s2 返回2; s1
return0;
}}
然後開始實現減法運算,第一步,(補齊),不再贅述。第二步,交換,我們要始終讓sum1裡儲存大的那個數,sum2裡放小的,這邊便於下面的迴圈遍歷。所以根據前面的比較函式,進行可能的交換。如下。
code:
int len = num1.
length()
- num2.
length()
, flag =
compare
(num1, num2)
;(flag ==1)
//始終讓num1>num2
然後就是最重要的迴圈遍歷實現減法了,在這一步裡模擬加法,思想相同,但細節不同。加法會產生可能的進製,但是減法可能需要借位。(想必大家都能理解),所以仍然需要定義乙個mod,如果需要借位,mod賦值-1,否則是0。如下。
code:
int mod =0;
//借位
string ans = num1;
for(
int i = num1.
length()
-1; i >=
0; i--
)//總是num1-num2
else
}
最後一步,細節處理,與加法時相同,需要處理掉前面多餘的0。(注意:實現減法前,我們已經手動讓sum1>sum2,所以在實行最後一次減法時,一定不會「借位」。)但是正是由於交換,所以最後需要根據flag判斷得到的結果是正還是負,如果是負數,需要額外加 『-』,如下。
code:
char tempans[
1000];
int k =
0, pos =0;
for(
int i =
0; i < ans.
length()
; i++)}
tempans[k]
='\0'
; string finalans = tempans;
if(flag ==1)
finalans =
'-'+ finalans;
完整(函式)code:
int
compare
(string s1, string s2)
//s1>s2 返回2; s1
return0;
}}string substr
(string num1, string num2)
else
if(len <0)
if(flag ==1)
//始終讓num1>num2
int mod =0;
//借位
string ans = num1;
for(
int i = num1.
length()
-1; i >=
0; i--
)//總是num1-num2
else
}char tempans[
1000];
int k =
0, pos =0;
for(
int i =
0; i < ans.
length()
; i++)}
tempans[k]
='\0'
; string finalans = tempans;
if(flag ==1)
finalans =
'-'+ finalans;
if(pos)
return finalans;
else
return
"0";
}
大整數四則運算
儲存方式 規定 整數的高位儲存在陣列的高位,整數的低位儲存在陣列的低位。例如 235813,則d 0 3,d 1 1,d 2 8.此方式以此類推。但注意 通常輸入為字串str 0 2 str 1 3 str 2 5 讀入之後需要反轉一下。加法運算 模板 include include struct ...
大整數四則運算
電腦可以處理很大的數。但是更大的數字運算由於資料型別占有的有限並不能表示出來,所以需要對很大的數字進行大整數處理,光是聽著就感覺令人心潮澎湃呢。核心思想 陣列存數,乙個單元存一位 下面是大整數儲存,比較的模板 struct bign bign change char str return a 比較兩...
大整數的四則運算
由小學時候的加法運算可以歸納出對其中一位進行加法的步驟 將該位上的兩個數字和進製相加,得到的結果取個位數作為該位結果,取十位數作為新的進製。高精度加法的做法與此完全相同,可以直接來看實現的 程式 include include 定義乙個結構體儲存大整數 struct bign 將整數轉換為bign ...