(我已經把csdn當作筆記本了~…,這裡語言會淺顯一點不想搞得很高階的樣子)
高精度是各類資訊競賽中的必會型別,高精度一般就是整數字太長,小數字太大,程式很難直接運算或表達。
直接進入正題,不磨蹭,將問題分析一點點解決。
q1:為什麼需要高精度
c語言現有的型別無法儲存,上圖,看一眼即可
q2:如何實現加法,通過什麼實現
小學我們學過,加減乘除,對於每一位,滿十進1,不滿十直接相加即可。對於高精度的加法,採用的也是這個原理,我們可以通過陣列來儲存每一位,用陣列來模擬加法,這樣可以實現很大位的加法運算,下圖就是原理。
我們可以通過三個陣列來實現,第一二個儲存加數,第三個儲存結果。
首先我們要解決難點:
q3:如何儲存陣列-------將每一位陣列倒序儲存到陣列內,為什麼倒序/
a3:還是看上圖,個位和個位是對齊的,方便計算,假如我們第一位放最大位數,那麼假如兩個數最大個數不同,加法算式就會出現下面情況
1234 ·············· ---- 1234 ················· --------4321(倒序)
45···················---- 0045 ··················--------54
這樣加不對········這樣也可以·····················雖然這樣我們看著不方便,但是程式方便
q4:如何錄入
a4:如果真的是單純的錄入數字,而採取錄入到陣列的話,錄入的時候會遇到個問題,每位儲存乙個數字意味著每輸入一位數字,就要按空格或者換行,否則用scanf會導致多個數字粘連起來。所以使用字元陣列很方便,然後讓字元陣列每一位減去』0』即可。
核心**:
//我們陣列第一位不儲存數,所以從i=1開始
for(itn i=
1;i<=
max(a,b)+1
;i++
)
全部**:
#include
#include
#include
using namespace std;
intmain()
,b[505]=
,c[505]=
;//注意這裡要賦值為0,不然可能出錯
int la,lb,lc;
scanf
("%s"
,s1)
;scanf
("%s"
,s2)
; la=
strlen
(s1)
; lb=
strlen
(s2)
;for
(int i=
0;i)//在這裡,陣列第0位被跳過了
a[la-i]
=s1[i]
-'0'
;for
(int i=
0;i) b[lb-i]
=s2[i]
-'0';
lc=max(la,lb)+1
;for
(int i=
1;i<=lc;i++)if
(c[lc]==0
&& lc>
0)lc--
;for
(int i=lc;i>
0;i--
)printf
("%d"
,c[i]);
return0;
}
這麼辛苦點個?吧 高精度演算法 791 高精度加法
給定兩個正整數,計算它們的和。輸入格式 共兩行,每行包含乙個整數。輸出格式 共一行,包含所求的和。資料範圍 1 整數長度 100000 輸入樣例 1223 輸出樣例 35注意點 1.兩個整數較大,用字串來存,這樣的話,可以呼叫它的size 方法 2.將兩個大的整數,存入vector陣列中,最好把整數...
高精度演算法之加法減法
高精度加法是高精度演算法裡面最容易思考的乙個 其實現過程並不難 注意的地方應該是進製的問題 思路 我們可以設兩個陣列a 10090 b 10090 這兩個陣列的作用是用來儲存高精度數的數字 string型別字串str1,str2 用來輸入資料 然後貼 include include include ...
高精度數演算法 加法
基本資料型別 長度有限。所以大的資料被單獨拿出來。高精度演算法就是模擬我們在紙上的運算。要死要死要死 我忘記了。乙個空間有剩餘的int後面是自帶補0的啊。還有平時沒有注意到的三目運算子 length str1 str2 str1 str2 上 include include define max 1...