開篇總述:精度計算的教學比較雜亂,無系統的學習,且存在同法多線的方式進行同一種運算,所以我寫此篇的目的只是為了直指本質,不走教科書方式,步驟冗雜。
一,加法
我在此講兩種方法:
1,首先科普常識:
length()和size()函數不可統計字符型數組大小;sizeof返回的是總數組
2,為什么字符型數組可以直接接收輸入而不用索引接收
原因:?數組名的隱式轉換規則? 和 ?輸入函數的設計機制
(1)數組名的隱式轉化:
在代碼中直接使用字符型數組組名,它會 ?自動退化為指向數組首元素的指針?。
s1
?作為指針傳遞了數組的起始內存地址,輸入函數(如?scanf
)會從該地址開始 ?連續寫入字符,直到遇到終止符(如空格、換行或字符串結束符?\0
)
(2)輸入函數工作機制:
以?scanf("%s", s1)
?為例:
- ?按格式讀取?:
%s
?表示按字符串格式讀取輸入。 - ?連續內存寫入?:
- 從?
s1
?的起始地址開始,逐個寫入字符到?s1[0]
,?s1[1]
,?s1[2]
... - 自動在末尾添加?
\0
?終止符(因此數組長度需足夠大)
- 從?
3,為什么其他數組不能一次輸入連續讀入
- 字符數組的特殊性?:
- 字符串本質是 ?連續的字符序列,天然適合用指針連續操作。
- 輸入函數(如?
scanf
)專門為字符串設計了?%s
?格式符。
- ?其他類型數組?:
- 例如?
int a[505]
,每個元素可能需不同格式(如?%d
),無法統一連續處理。 - 必須顯式指定索引或指針偏移
- 例如?
好了,基礎知識已經掌握了,讓我們直接看代碼吧。
法一:
倒置是因為加法是從后往前加的,所以倒置過來在代碼里從前往后加模擬,只是換了方向。
此時里面的加法模擬, 我們先不看加號就是這樣,e[i] = c[i] + d[i],e數組統計數字總和,每個位數上的數字相加,此時會出現加后為兩位數,此時要往后進一位 ,所以有? e[i + 1] ?= e[i]/ 10;
而原來的位數上保留個位上的數字 所以有? e[i] = e[i] % 10; 但之后進入下一次循環,開始加下一個位數,此時會出現一種情況,在前一位的加法里面,如果有進位發生到此處怎么把進位的數加上,所以此時有了???e[i] += c[i] + d[i]? 將之前的進位的情況數字加上。
法二:
只是進位的方式發生改變,此時jw單獨設成一個變量,如果前面有jw,在下一次循環加上。
之后循環完畢,看是否還有進位,若還有則總位數加1,將jw變量設在開頭代表進位的數字,m數組在函數里面就已經將結果輸入完畢,最后只需要傳入位數。
最后返回的是運算完成后數字的位數
二,減法
注意:此題重在分析:
1,減是兩個數字相減,此時如果第一個數比第二個大,則可以安全相減,若比第二個小,則需要添負號,再把兩數反過來相減,這就涉及到數學知識,兩個數若相減,前一個數比后一個數小,則它們最后的結果相當于后面大的數減前面小的數,再在前面添負號。
2,而此時,就需要設置一個布爾類型判斷兩數誰小了。
原題解如下:
此時涉及到字符串的知識
字典序:
字符串比較規則。
字典序的核心規則?(以?m > n
?為例):
m 和 n 都是字符串,但怎么比較大小
-
?從左到右逐字符比較?
比較?m
?和?n
?的第一個字符:- 如果?
m[0]
?的ASCII碼 ?大于??n[0]
?→ 直接判定?m > n
?為?true
。 - 如果 ?小于? → 判定為?
false
。 - 如果 ?相等? → 繼續比較下一個字符。
- 如果?
-
?若所有字符均相同?
- 較長的字符串更大(例如?
"hello" > "hell"
)。 - 長度和內容完全相同時 →?
m > n
?為?false
。
- 較長的字符串更大(例如?
比較的是字符串里面每個字符的ASCLL編碼。
?m > n ,此為逐個逐個比較字符串里面逐個的字符編碼,看誰先出現大的數,
但是思考?
"100"和"99"這類情況,則反而判斷出后面比前面大,那該怎么克服呢,只需要按我題解一樣先判斷長短就行。
ok,結束,下期的事我們下期再聊。