Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
師大資工系ACM-ICPC讀書會:壹、字串處理與大數運算
Search
Maplewing
October 14, 2013
Programming
0
120
師大資工系ACM-ICPC讀書會:壹、字串處理與大數運算
Maplewing
October 14, 2013
Tweet
Share
More Decks by Maplewing
See All by Maplewing
師大資工系ACM-ICPC讀書會:肆、鏈結串列與二元樹
sinmaplewing
0
100
資訊實務應用讀書會 第七堂課:jQuery
sinmaplewing
0
1.9k
師大資工系ACM-ICPC讀書會:參、堆疊與佇列
sinmaplewing
0
180
師大資工系ACM-ICPC讀書會:貳、排序搜尋與數學基礎
sinmaplewing
0
150
資訊實務應用讀書會 第六堂課:Basic CSS
sinmaplewing
0
1.6k
師大資工系ACM-ICPC讀書會:零、比賽介紹、解題系統介紹
sinmaplewing
0
170
資訊實務應用讀書會 第四堂課(支線):Linux
sinmaplewing
0
1.7k
資訊實務應用讀書會 第一堂課:Basic HTML
sinmaplewing
1
2k
Other Decks in Programming
See All in Programming
モバイルアプリにおける自動テストの導入戦略
ostk0069
0
100
わたしの星のままで一番星になる ~ 出産を機にSIerからEC事業会社に転職した話 ~
kimura_m_29
0
170
急成長期の品質とスピードを両立するフロントエンド技術基盤
soarteclab
0
920
似たもの同士のPerlとPHP
uzulla
1
130
短期間での新規プロダクト開発における「コスパの良い」Goのテスト戦略」 / kamakura.go
n3xem
2
160
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
14 Years of iOS: Lessons and Key Points
seyfoyun
1
770
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
100
Fibonacci Function Gallery - Part 1
philipschwarz
PRO
0
180
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
180
Refactor your code - refactor yourself
xosofox
1
250
As an Engineers, let's build the CRM system via LINE Official Account 2.0
clonn
1
670
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Adopting Sorbet at Scale
ufuk
73
9.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
How to train your dragon (web standard)
notwaldorf
88
5.7k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
The Cost Of JavaScript in 2023
addyosmani
45
7k
Done Done
chrislema
181
16k
Speed Design
sergeychernyshev
25
670
Transcript
壹、字串處理與大數運算 師大資工系 灆洢 取自於<提升程式設計的邏輯思考力> 5.1 & 5.2
字串處理
使用string類別做為字串變數宣告的方法。 string s = “This is a string.”; 字串:使用C++ string類別
string s = “This is a string.”; printf( “%c\n”, s[1]
); // => h s[2] = ‘a’; s[3] = ‘t’; printf( “%s\n”, s.c_str() ); // => That is a string. 字串取值:利用 [ ]
string s = “This is a string.”; printf( “%c\n”, s[1]
); // => h s[2] = ‘a’; s[3] = ‘t’; printf( “%s\n”, s.c_str() ); // => That is a string. 字串轉C string:使用c_str()
char cstr[] = “This is a string.”; string s =
string(cstr); // s = “This is a string.” C string轉字串:利用string建構式
string s; cin >> s; //以空白符、換行符、Tab做分隔切割 getline(cin, s); //以換行符做分隔切割 字串輸入:cin、getline
string s = “This is a string.”; cout << s
<< ‘\n’; // => This is a string. printf( “%s\n”, s.c_str() ); // => This is a string. 字串輸出:cout、printf
string s = “This is a string.”; cout << s.length()
<< ‘\n’; // => 17 字串長度:length() ( size() )
string s = “This ”, t = “is ”; s
+= t; s += “a ”; s += “string.”; cout << s << ‘\n’; // => This is a string. 字串相接:+=、+
string a = “This”, b = ”That”; a > b
// true a < b // false a == b // false a != b // true a >= b // true a <= b // false 字串比對:>、<、==、!=、>=、<=
範例一:WRETYU (UVa 10082)
範例二:TeX Quotes (UVa 272)
範例三:Periodic Strings (UVa 455)
•401 •10010 •10361 •537 •409 作業 •10878 •10815 •644 •10115
大數運算
大數是什麼?可以吃嗎? • 簡單來說,大數就是非常大的數字。 • C語言儲存整數的限制: int:-231≦ int ≦ 231-1 (21億,9~10位數)
long long:-263 ≦ long long ≦ 263-1 (19位數) • 那要如何存一個100位數的數字呢? 利用大數!
如何儲存大數?(cont.) • 利用Array一格一格的特性,我們就可以把好幾位數分成好幾格。 • Ex. 儲存 1254 可以如下圖: 1 2
5 4 array[0] array[1] array[2] array[3]
如何儲存大數?(cont.) • 但是int的Array沒辦法讓你直接儲存並分成一格一格。 • (X)你不可以這麼做:scanf( “%大數”, intArray ); • 所以我們利用可以讓我們一儲存就幫你分好一格一格的Array,也
就是char的Array,把大數當成字串存進去。 • (O)你可以這麼做:scanf( “%s”, charArray );
如何儲存大數?(cont.) • 但是儲存完後,會有兩個問題: • 1. char陣列存完,數字會變成字元。若將存起來的 數字(已經是字元)做四則運算會先將其對應於ASCII 碼再進行加減。
如何儲存大數?(cont.) • 2.位數無法對齊 • Ex. 1254 + 916 Array1[0] Array1[1]
Array1[2] Array1[3] Array1[4] Array1[5] 1 2 5 4 ‘\0’ Array2[0] Array2[1] Array2[2] Array2[3] Array2[4] Array2[5] 9 1 6 ‘\0’ 兩個個位數在不同格,難相加。
如何儲存大數?(cont.) • 解決方法:儲存時將位數倒過來儲存。 • Ex. 1254 + 916 Array1[0] Array1[1]
Array1[2] Array1[3] Array1[4] Array1[5] 4 5 2 1 ‘\0’ Array2[0] Array2[1] Array2[2] Array2[3] Array2[4] Array2[5] 6 1 9 ‘\0’ 個位 十位 百位 千位 ……
如何儲存大數?(cont.) • 綜合以上解決方法,我們就可以依照以下步驟儲存大數! • 1.先利用char的Array將使用者輸入的大數分成一格一格。 • 2.將char的Array中一格一格的數字全部減去字元0的ASCII碼值存進int的 Array中,存進去時順便倒轉位置。 • 如此一來,大數就儲存進來了!(後面會有示範)
• 題外話:利用char的Array中的’\0’可以找到此數字目前幾位數。
如何儲存大數?(cont.) CharArray[ 0] CharArray[ 1] CharArray[ 2] CharArray[ 3] CharArray[
4] CharArray[ 5] ‘1’ (49) ‘2’ (50) ‘5’ (53) ‘4’ (52) ‘\0’ (0) IntArray[0] IntArray[1] IntArray[2] IntArray[3] IntArray[4] IntArray[5] 4 5 2 1 以存1254為例:
大數I/O • Input: • 利用scanf( “%s”, 字串名 ),再轉成int陣列。(倒過來放進去) • Output:
• 利用for迴圈倒過來輸出。 • 1.紀錄位數,並從最高位數那格輸出到第0格。 • 2.將沒用到的格子補0,找到第一個不是0後開始輸出,直到第0格。(如果全部都是0 就輸出一個0)。 Array1[0] Array1[1] Array1[2] Array1[3] Array1[4] Array1[5] 4 5 2 1
大數加法(Ex. 1254+9160=10414 ) [0] [1] [2] [3] [4] Char Array
Int Array Char Array Int Array + Result ‘1’ ‘2’ ‘5’ ‘4’ ‘\0’ -’0’ (-48)且倒轉 4 5 2 1 ‘9’ ‘1’ ‘6’ ‘0’ ‘\0’ -’0’ (-48)且倒轉 0 6 1 9 1. 位數對應相加 2.檢查進位 4+0=4 5+6=11 2+1=3 1+9=10 4 11 3 10 4 1 4 0 1
大數減法(Ex. 9160-1254=7906) [0] [1] [2] [3] [4] Char Array Int
Array Char Array Int Array - Result ‘9’ ‘1’ ‘6’ ‘0’ ‘\0’ -’0’ (-48)且倒轉 0 6 1 9 ‘1’ ‘2’ ‘5’ ‘4’ ‘\0’ -’0’ (-48)且倒轉 4 5 2 1 1. 位數對應相減 2.檢查借位 0-4=-4 6-5=1 1-2=-1 9-1=8 -4 1 -1 8 6 0 9 7
大數乘法(Ex.19x19) • 首先,先來看一下乘法直式是如何做的! 1 9 1 9 1 7 1
1 9 × + 3 6 1
大數乘法(Ex.19x19) • 把過程改變一下: 1 9 1 9 × + 1
18 81 進位 361 1. 將A每一位數對B每一位數相 乘,並將結果加於A此位數 加B此位數的值。 2. 最後檢查進位。 Array[2] Array[1] Array[0] 第0格與第0格相乘,結果加於第0+0=0格 81 第1格與第0格相乘,結果加於第1+0=1格 9 9 1 第0格與第1格相乘,結果加於第0+1=1格 第1格與第1格相乘,結果加於第 1+1=2格
大數比較:>, < 和 == • 大於、小於:先比較位數,再從高次方開始比較。 • 等於:先比較位數,再比較每一位數是否相等。 Array1[0] Array1[1]
Array1[2] Array1[3] Array1[4] Array1[5] 4 5 2 1 Array2[0] Array2[1] Array2[2] Array2[3] Array2[4] Array2[5] 9 1 6
大數除法&餘法(Ex.898653/52) • 以一格存4位數 [5] [4] [3] [2] [1] [0] 8
9 8 6 5 3 5 2 8 9 3 7 1 3 7 8 7 1 4
大數延伸 • 大數開方 • 一格不只存1位數,也可存N位數,藉此可以儲存更大的大數: int:-231≦ int ≦ 231-1 (21億,9~10位數)
long long:-263 ≦ long long ≦ 263-1 (19位數)
範例一:Primary Arithmetic (UVa 10035)
範例二:500! (UVa 623)
•424 •10106 •465 •748 •10494 作業
謝謝聆聽 資料取自於<提升程式設計的邏輯思考力> 5.1 & 5.2