Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
師大資工系ACM-ICPC讀書會:壹、字串處理與大數運算
Search
Maplewing
October 14, 2013
Programming
170
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
師大資工系ACM-ICPC讀書會:壹、字串處理與大數運算
Maplewing
October 14, 2013
More Decks by Maplewing
See All by Maplewing
師大資工系ACM-ICPC讀書會:肆、鏈結串列與二元樹
sinmaplewing
0
180
資訊實務應用讀書會 第七堂課:jQuery
sinmaplewing
0
2.1k
師大資工系ACM-ICPC讀書會:參、堆疊與佇列
sinmaplewing
0
280
師大資工系ACM-ICPC讀書會:貳、排序搜尋與數學基礎
sinmaplewing
0
220
資訊實務應用讀書會 第六堂課:Basic CSS
sinmaplewing
0
1.8k
師大資工系ACM-ICPC讀書會:零、比賽介紹、解題系統介紹
sinmaplewing
0
260
資訊實務應用讀書會 第四堂課(支線):Linux
sinmaplewing
0
1.9k
資訊實務應用讀書會 第一堂課:Basic HTML
sinmaplewing
1
2.2k
Other Decks in Programming
See All in Programming
golang-bob.pdf
iwatsukayura
0
130
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
180
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
140
contenteditable と日本語入力に向き合う
colorful12
0
200
Domain-Driven Transformation
hschwentner
2
2.3k
Web Framework Benchmark Battle 2026, Any%
a_matsuda
2
2.5k
AIに “答え“を書かせるのを やめてみた
___akari11
0
120
ActionController meets Protocol Buffers
sorah
0
560
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Producing Creativity
orderedlist
PRO
348
41k
Agile that works and the tools we love
rasmusluckow
331
22k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.1k
The Curse of the Amulet
leimatthew05
3
16k
Site-Speed That Sticks
csswizardry
13
1.6k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
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