Upgrade to Pro — share decks privately, control downloads, hide ads and more …

師大資工系ACM-ICPC讀書會:壹、字串處理與大數運算

Maplewing
October 14, 2013

 師大資工系ACM-ICPC讀書會:壹、字串處理與大數運算

Maplewing

October 14, 2013
Tweet

More Decks by Maplewing

Other Decks in Programming

Transcript

  1. 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. 字串取值:利用 [ ]
  2. 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()
  3. char cstr[] = “This is a string.”; string s =

    string(cstr); // s = “This is a string.” C string轉字串:利用string建構式
  4. 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
  5. string s = “This is a string.”; cout << s.length()

    << ‘\n’; // => 17 字串長度:length() ( size() )
  6. string s = “This ”, t = “is ”; s

    += t; s += “a ”; s += “string.”; cout << s << ‘\n’; // => This is a string. 字串相接:+=、+
  7. string a = “This”, b = ”That”; a > b

    // true a < b // false a == b // false a != b // true a >= b // true a <= b // false 字串比對:>、<、==、!=、>=、<=
  8. 大數是什麼?可以吃嗎? • 簡單來說,大數就是非常大的數字。 • C語言儲存整數的限制: int:-231≦ int ≦ 231-1 (21億,9~10位數)

    long long:-263 ≦ long long ≦ 263-1 (19位數) • 那要如何存一個100位數的數字呢? 利用大數!
  9. 如何儲存大數?(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’ 兩個個位數在不同格,難相加。
  10. 如何儲存大數?(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’ 個位 十位 百位 千位 ……
  11. 如何儲存大數?(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為例:
  12. 大數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
  13. 大數加法(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
  14. 大數減法(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
  15. 大數乘法(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格