演算法思想:預處理輸入的整數字串,去掉開頭的『0』,然後減法操作,減法操作過程中,如果被減數小於減數,則交換兩個數 賦值給被減數和減數變數,始終保持 大數減小數。最後 再 根據 是否交換賦值 來 確定正負。
**實現:
1 #include2 #include3using
namespace
std;45
//去掉字元開頭的0
6void processstr(string &str)717
18//
減法函式實現
19void bigintsubtract(string stra,int lena,string strb,int lenb,char* res,int
lenres)
2028 invaildinput=false;29
30//
確定減數和被減數
31string subtrahend=stra;//
被減數32
string subtracter=strb;//
減數33
34if(lenb>lena)
3539
if(lena==lenb)//
長度相等時,判斷大小
4046
else
if(stra4751
else
52return;53
}5455//
減法運算
56int lenl=subtrahend.size();
57int lens=subtracter.size();
58int flag=0;//
標記是否借位
59int num=0;//
存放減法操作中間數
6061
int il=lenl-1,is=lens-1,ir=lenres-2;//
注意 ir的初始值,因為 下標和\0
62for(;il>=0&&is>=0&&ir>=0;il--,is--,ir--)
6370
else
717576}
7778
if(1==flag)//
中間出現借位,12345-789這種情況
79 res[ir--]=subtrahend[il--]-flag;
8081
while(il>=0)//
長的減短的,長的剩餘部分直接拷貝
8285
86if(subtrahend==strb)//
交換存放,即為負
87 res[ir]='-'
;88else res[ir]='+'
;8990return;91
}9293void
main()
94128
129 cout<<"
the result is:
"130 system("
pause");
131return
;132 }
原碼,反碼,補碼的表示範圍總結
小數 x0 x1x 2x3 xn,x 0是符號 位 整數 x0x 1x2x 3 xn x0是 符號位 首先形成的概念是 原碼和反碼小數表示的範圍是一樣的,僅僅是二進位制的儲存不同罷了。更有趣的是它們的儲存範圍是關於零點對稱的!原碼小數,反碼小數都是 1 2 n x 1 2 n 中間是 0 0 兩種x...
C語言中資料型別的表示範圍
問題 sizeof int 2,int的表示範圍為什麼是 2 15 2 15 1?答 對於有符號數,最高位為符號位。二進位制原碼最大值為0111111111111111 2 15 1,最小值為 1111111111111111 2 15 1 而0分為 0和 0,即0000000000000000和 ...
浮點數的表示 基本格式 規格化 表示範圍
浮點數表示法是指以適當的形式將比例因子表示在資料中,讓小數點的位置根據需要而浮動。這樣,在位數有限的情況下,既擴大了數的表示範圍,又保持了數的有效精度。階碼 階碼是整數,階符和 m 位階碼的數值部分共同反映浮點數的表示範圍及小數點的實際位置,常用移碼或補碼表示。ieee754標準中採用移碼的表示形式...