Top Banner
Скъпи читатели, Поради постоянното изчерпване на книгата и трудностите с намирането й в мрежата за разпространение решихме да ви направим малък „подарък“, като публикуваме книгата безплатно в електронен вид (лицензът за рапространение се намира на страница 2). С пожелание за много успехи, 10 февруари 2013 Панайот и Преслав За контакти с нас (авторите): Уеб сайт на книгата: http://www.programirane.org Facebook група: http://www.facebook.com/groups/168112146541301
740

Nakov Dobrikov Programming++Algorithms eBook 10 Feb 2013

Nov 01, 2014

Download

Documents

bou81

Nakov-Dobrikov-Programming++Algorithms-eBook
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript

, , ( 2). , 10 2013 (): - : http://www.programirane.org - Facebook : http://www.facebook.com/groups/168112146541301 1 - , 2 740 : , 2012. , , . . . = ++; pdf , , , . , . , pdf . ............................................................................................................................. 3 .......................................................................... 13 ........................................................................... 15 0 , , 17 0.1. .................................... 18 0.1.1. - ................................................................................... 18 0.1.2. .................................................................... 19 0.1.3. ................................................................... 20 0.1.4. ............................................................................... 20 0.1.5. ...................................................................................................... 21 0.1.6. ...................................................................... 21 0.1.7. ........................................................... 22 0.2. ................................................................................................................ 23 0.3. ................................................................................................... 24 0.3.1. ............................................................................. 24 0.3.2. ......................................................................................... 25 0.3.3. ................................................................................................. 25 0.3.4. .................................................................................................................... 26 0.4. = ++........................................................................................... 26 0.4.1. ................................................................................ 26 0.4.2. ................................................................... 27 0.4.3. C? .......................................................................................................................... 28 0.4.4. ............................................................................. 29 0.5. ........................................................................................................................... 29 ................................................................................................................................. 29 0.5.1. ................................................................................................................ 29 0.5.2. ........................................................................................................... 30 0.5.3. .................................................................................................... 30 1 ...................................................................... 33 1.1. ........................................................... 33 1.1.1. .............................................................................. 33 - ...........................................................................................................................33 - ....................................................................................................................................35 - . ...................................37 - ...........................................................................................................38 - , , n- ............................................................................................39 - . ........................................................................................40 - ...............................................................................................................................41 1.1.2. ........................................................... 43 1.1.3. ................................................................................................................... 44 - ................................................................................45 - . ...............................................47 - ..............................................................................50 - , ........................................51 4 1.1.4. ...................................................................................... 52 - .................................................................................................................52 - . .....................................................................................54 1.1.5. , . ........................... 56 1.1.6. ................................................................................ 59 - p- .........................................................61 - p- . .......................63 1.1.7. .................................................................................................................. 65 - .............................................................65 - ....................................................................66 1.2. ............................................................................................................ 67 1.2.1. ....................................................................................................................... 68 1.2.2. ...................................................................................................... 69 1.2.3. - . ........................................................ 74 1.2.4. - ............................................................................................... 76 1.2.5. ....................................... 77 1.3. ................................................................................ 80 1.3.1. ..................................................................................................................... 80 - ...........................................................................................................................81 - .......................................................................................................84 - ...................................................................................................86 1.3.2. .......................................................................................................................... 86 - , .............................................................................................................86 - .............................................................................................................................88 1.3.3. ..................................................................................................................... 90 1.3.4. ......................................................................................................... 92 - ...........................92 - .........................93 - ...........................94 1.3.5. ............................................................................................. 96 - .....................................................................................................96 1.4. ................................................................................... 97 1.4.1. ............................................................................................ 99 1.4.2. ............................................................................................... 99 1.4.3. O(F): ..........................................................................................100 1.4.4. O(F): .........................................................................................102 1.4.5. O(F): .........................................................................................103 1.4.6. ..................................................................105 1.4.7. ..........................................................................106 1.4.8. ..................................................................107 - ....................................................................................................... 107 - ....................................................................................... 107 - ................................................................................................ 107 - if- ................................................................................................................... 107 - ................................................................................................................................. 108 - .................................................................................................................. 108 - ....................................................................................... 109 - ................................................................................................... 110 - ............................................................................................................................ 110 1.4.9. .....................................................................................112 - ............................................................. 112 5 - .............................................................. 114 - ..................................................................................... 114 1.4.10. ........................................................117 - .................................................................................................. 117 - .................................................................................................... 118 - ............................................................................................................... 118 1.4.11. ..............................................................120 1.5. ...............................................................................................................120 1.5.1. ........................................................................................................120 1.5.2. ..................................................................................................................133 - , , .................................................................................... 133 - .................................................................................... 137 - ....................................................................................................... 138 2 ...............................................143 2.1. , , ........................................................................................................144 - .................................................................................................................................... 145 - ............................................................................................................................... 146 - ..................................................................................................................................... 147 2.1.1 () ..................................................................147 - .................................................................................................................................... 147 - ............................................................................................................................... 149 2.1.2 () .............................................................................151 - ....................................................................................................... 152 - ........................................................................................................ 153 - , ........................................................... 153 - , ........................................................... 154 - ....................................... 154 - , ................................................................ 155 2.2. ................................................................................................................158 - ..................................................................................................... 163 - ..................................................................................................... 164 - .................................................................................. 164 - ......................................................................................................................... 168 2.3. ........................................................................................................169 2.3.1. . - .............................................................................172 2.3.2. B- ......................................................................................................................174 2.4. - ........................................................................................................................176 - - ..................................................................................................................... 176 - ............................................................................................................................. 177 2.4.1. - .............................................................................................178 - ................................................................... 178 - .............................................................................................. 178 - - ................................................................................. 179 - - .......................................................... 179 - - .............................................................................. 180 2.4.2. .......................................................................................................184 - ............................................................................................................184 - ............................................................................................................. 184 - ...................................................................................................... 185 - .............................................................................................................. 185 - ..............................................................................................................185 6 - ........................................................................................ 185 - .................................................................................................. 186 2.4.3. - .......................................................................................186 2.5. ...............................................................................................................192 2.5.1. ........................................................................................................192 2.5.2. ..................................................................................................................196 3 ...........................................................................................................199 3.1. ................................................................................................200 3.1.1. .................................................................................................200 3.1.2. ...........................................................................................201 3.1.3. . .............203 3.1.4. ....................................................................................................206 3.1.5. .............................................................................................207 3.1.6. ...........................................................................................208 3.1.7. .....................................................................213 3.1.8. ........................................................................................215 3.1.9. .........................................................................216 3.1.10. .....................219 3.2. ......................................................................................221 3.2.1. ......................................................................................221 3.2.2. ................................................................................................223 3.2.3. ..................................................................................................226 3.2.4. .....................................................................................229 3.2.5. ......................................................................................232 3.3. ........................................................................................................233 3.3.1. ...............................................................................235 3.3.2. .................................................................................236 3.3.3. ...............................................................................................237 3.3.4. ........................................................237 3.3.5. ..............................................................................................................237 3.3.6. .........................................................................................................238 3.3.7. .........................................................................238 3.3.8. - ...............................................................239 3.3.9. - .............................................................................239 3.3.10. ...............................................................................................239 3.4. ...............................................................................................................240 3.4.1. ........................................................................................................240 3.4.2. ..................................................................................................................243 4 .................................................................................................................245 4.1. .................................................................................................246 4.1.1. .........................................................248 4.1.2. ...........................................................249 4.2. . ..................................................................251 4.3. .................................................................................................................252 4.4. .......................................................................................................256 4.5. ..............................................................................................258 4.6. ...............................................................................................................260 4.6.1. ........................................................................................................260 7 4.6.2. ..................................................................................................................261 5 .......................................................................................263 5.1. ...............................................................................................................263 5.2. ........................................................................267 5.2.1. .......................................................................................................267 5.2.2. , .......................................................268 5.2.3. ( ) .............................................268 5.2.4. ............................................269 5.2.5. ........................................................................................269 5.2.6. ...............................................................270 5.3. ............................................................................................................271 5.3.1. ...................................................................................................271 5.3.2. ..............................................................................................274 5.4. , ................................................................276 5.4.1. .......................................277 - - ................................................... 277 - ......................................................................................... 279 - ...................................................... 281 5.4.2. .............................................................................................283 - ............................................................................................. 284 - - ............................................................................................... 284 - .......................................................................................................... 285 - ........................................................................................... 288 - ...................................................................................................... 290 - ................................................................ 293 - ........................................................... 293 - - ....................................................................................... 294 - - ............................................... 297 5.4.3. ...............................................................................................................................297 - ............................................................ 297 - .............................................................................................. 300 5.4.4. . .............................................300 5.4.5. .............................................................................................................303 5.4.6. ...........................................................................................................................306 - ............................................................................................................. 307 - ............................................................................ 311 - ...................................................................................................... 312 5.5. . .........................................312 5.5.1. . ...................................................313 5.5.2. .........................................................................................314 5.5.3. .................................................................................................317 5.5.4. ..................................................................................................318 5.5.5. ..............................................................................................320 5.5.6. ..................................................................................322 5.5.7. .....................................................324 5.5.8. ......................................325 5.6. .............................................................................................326 5.6.1. ........................................................................................326 5.6.2. .........................................328 5.6.3. . .....................................330 8 5.6.4. k- ........................................................................333 5.7. .........................................................................334 5.7.1. ....................................................................................334 - ....................................................................................................... 334 - ............................................................................................................ 338 - ........................................................................... 340 5.7.2. ..............................................................................................340 - .................................................................................. 341 5.7.3. ............................................................................................343 5.7.4. ..................................................................................................................................346 5.7.5. , .......................................................................................348 - p- p- .......................................................................................................... 350 5.7.6. . ................................................353 5.8. ..............................................................................................354 5.8.1. . .................................................................354 - .................................................................. 355 - ................................................................... 355 5.8.2. ..................................................................................................355 5.9. ...............................................................................................................357 5.9.1. ........................................................................................................357 5.9.2. ..................................................................................................................363 6 . NP- ..........................................369 6.1. .............................................................................................369 6.1.1. .....................................................................................................369 6.1.2. ....................................................................................................370 6.1.3. ..........................................................................................................370 6.1.4. ..........................................................................................................................370 6.2. NP- ................................................................................................................373 6.3. .............................................................................................................374 6.3.1. ......................................................................376 6.3.2. .....................................................................................................380 6.3.3. - ....................................................................383 6.3.4. ...........................................................................................................385 6.3.5. ............................................................................................388 6.3.6. ...........................................................................391 6.3.7. ................................................................................................395 6.4. ...........................................................................398 6.4.1. ( ).............................................................398 6.5. ......................................................................................401 6.5.1. "X"- "O".....................................................................................................402 6.5.2. .........................................................................405 6.5.3. - ....................................................................................................406 6.5.4. - ...................................................408 6.6. ...............................................................................................................409 6.6.1. ........................................................................................................409 6.6.2. ..................................................................................................................413 - NP- ................................................................................................................ 413 - ........................................................................................................... 425 7 .......................................................................................427 9 7.1. K- ......................................................................427 7.2. .............................................................................................................................434 7.3. .......................................................................................445 7.4. ....................................................................................................450 7.5. ................................................................................................456 7.6. .........................................458 7.7. .................................................................................461 7.8. .............................................................................................464 7.9. ..........................................................................................466 7.10. ......................................................471 7.11. .......................................................................................................474 7.12. .............................................................................................................475 7.12.1. ......................................................................................................475 7.12.2. ................................................................................................................478 8 .........................................................................481 8.1. .............................................................................................................................481 8.2. ...........................................................................484 8.2.1. .....................................................................................................484 8.2.2. ..........................................................................................................495 8.2.3. ..............................................................................................497 8.2.4. . ...............................................504 8.2.5. ............................................................508 8.2.6. - ........................................................................................513 8.2.7. - ........................................................................517 8.2.8. ...................................................................................522 8.2.9. .................................................................................................526 8.3. ..............................................................................................528 8.3.1. .......................................................................................................528 8.3.2. .................................................................................................532 8.3.3. .............................................................................................................533 8.3.4. .................................................537 8.3.5. .....................................................539 8.3.6. .................................................................................540 8.3.7. ..........................................................................................542 8.3.8. ...........................................................543 8.3.9. ............................................................................................................548 8.3.10. .................................................................................................549 8.4. .................................................................551 8.4.1. .............................................................................................................552 8.4.2. ...............................................................................................................553 8.4.3. .......................................................................................................555 8.4.4. ....................................................559 8.4.5. ............................................................................................561 8.4.6. ...................................................................................................564 8.4.7. ............................................................................................565 8.4.8. .............................................................................................................568 8.4.9. ....................................................................................................571 8.4.10. .........................................................................................574 10 8.4.11. .............................................................................................................576 8.4.12. - ............................................................................................................579 8.4.13. ..............................................................................................582 8.5. ...............................................................................................................584 8.5.1. ........................................................................................................584 8.5.2. ..................................................................................................................591 9 ..................................595 9.1. ...............................................................................................................595 9.1.1. ...........................................................................................................596 9.1.2. ........................................................................598 9.1.3. .................................................................601 9.1.4. ...................................................................................604 9.1.5. .......................................................................................605 9.1.6. .....................................................................................607 9.1.7. ...............................................................................................608 9.1.8. . . ...........................................................610 9.2. .......................................................................................................616 9.2.1. ......................................................................617 - .......................................................................................... 618 9.2.2. ..........................................................................621 9.2.3. ..................................................................................................622 9.3. ........................................................................627 9.3.1. .........................................................................................628 9.4. ...............................................................................................................629 9.4.1. ........................................................................................................629 9.4.2. ..................................................................................................................633 10 ..............................................................................................637 10.1. ............................................................................................................................637 10.2. ........................................................................................................638 10.3. ................................................................................640 10.3.1. ...............................................................................................640 10.3.2. ................................................................................641 10.3.3. ........................................................................................643 10.3.4. ...........646 10.3.5. .................................................................................................646 10.3.6. .....................................................................................................648 10.3.7. .............................................................................................649 10.3.8. . .........................650 10.3.9. ............................................................................653 10.3.10. : PackBits ..............................................................655 10.4. ....................................................................................................656 10.4.1. - ......................................................................................656 10.4.2. ...............................................................................................660 10.4.3. .............................................................................671 10.4.4. K ......................................................................................................672 10.4.5. ............................................................................................673 10.5. ..............................................................................................681 10.5.1. ....................................................................683 11 10.5.2. ......................................................................................................686 10.5.3. : MNP-5...................................................................688 10.6. .......................................................................................................690 10.6.1. .....................................................................................................................691 10.6.2. ...........................................................................................................695 10.6.3. .............................................................................................696 10.6.4. ....................................................................697 10.6.5. LZ77. ..........................................................698 10.6.6. LZSS. ..............................................................................................698 10.6.7. FLZ. LZ77 ......................................................................................699 10.6.8. LZW. ................................................................................700 10.6.9. GIF. CompuServe .....................................................................706 10.6.10. ....................................................................707 10.6.11. ................................................................................708 10.6.12. LZW ..................................................................................................709 10.7. ..............................................................................................710 10.7.1. ..................................................................................710 10.7.2. JPEG ..............................................................................................................................711 10.7.3. . MPEG .......................................................713 10.7.4. ......................................................................................................................715 10.7.5. .......................................................................................716 10.8. .............................................................................................................717 10.8.1. ......................................................................................................717 10.8.2. ................................................................................................................725 ...........................................................................................................................727 ......................................................................................................733 12 - (, ) - , . , , " " . , - , , "" Introduction to Algorithms Cormen, Leiserson Rivest, . , "-", , . , . , . -. . , , , ( "" ) .. , , . - . , . , , , . , - . " ", , , . , - . , , -, - . , , , - , .., , , .., , , , , . . , . , - . , , - , . , , , , . 1 2002 14 15 , . , : - , ; - , -mail . , ( ) , . - , ( ) . ! , , . , - : - ; - , ; - ; - . ! , ! , 3 2005 . 16 0 , , "Think of all the psychic energy expended in seeking a fundamental distinction between 'algorithm' and 'program'". ~ Epigrams in Programming [Adams-1980] , , . , 1975 ( ), - , , , , . , , , , , . , , - . , , . 10 [, .] , , , . - , -. , ( ) computer science, . - , : ( : ), (: informatique), (: informatik) . informatics , . , informatics : , - computer science ( ), Microsoft Word . : (. International Olympiad in Informatics), (. Balkan Olympiad in Informatics). ... , - , , . 0 - , 18 0.1. , - - , 0.1. ( ? ?) 0.1. . 0.1.1. - , - . - , - - . - , . - : , , . 0 - , 19 , - . . - : " , - , ". , : , -, , , () , . , , , , , , . ( 0.1.1., 0.1.1. 0.1.1.). 0.1.1. : , . 0.1.1. - : , . 0.1.1. , . 0.1.2. , , - , , . - 0 - , 20 , , , ( , ). , , , , () . , . , -, , , , -. , - . - - , -, . , ( . hacker, hacking) ( . cracker, cracking) . , . ( ), , , . , . - - . , , , . 0.1.3. 10 - .. . - - ( -, - , ). , , - . , : , . , . 0.1.4. , , . ""- Maxis . , , - . , - , . -- 0 - , 21 -. 0.1.5. , . , : - : , . - : , , . : ( ) ( ). , , , , , . - , , : , . , : ? , , , -, . - . . -, . () , , . - - . -, . 0.1.6. , , . , , . , , : , , . , , ( ). ( ) ( 0 - , 22 ). () , . . - ( -) - "" . - - . , . . , - . - . 0.1.7. - : . , - - . : . , (, , , .). , . , , . , , , 25 . , , . , . . - : ( ). , , , : , - ( ) . 0 - , 23 0.2. ( . lamer), . , , , [-1989]. , - , , . -, - , , , , . , , . , , : i++; /* i */ e , , Minesweeper Windows - , 1 [Prize-2000]. , , . , , 10 . , . , , ( . garbage collector) , Java, , XX . , , - Google , . , , - + . , , " , O(n2)", - O(n3), n3 > n2. , C - , . , , , . , , , , , A B C D E F . , , , . 0 - , 24 , 10 10 -, , 10 , 10% -. , brute-force- ftp ( . File Transfer Protocol ) , , hack- , - 5 ( ), . , ( /, ). , , - (, ). , . , : 0x000000FF & (i >> 24) , - , : = |.|

\| =niinmfmn122_ , . , - , : , , . , , . , - , . , , -. ( ): , . , , , : , . 0.3. , . , . , , . 0.3.1. al-Khowarizmi, VIII Al-jabr wal muqabala (, - ). - , : 0 - , 25 Al-Khashi, XV t 16 . , , . , XII- Al-* , , , , [Knuth-1/1968]. , , : - ; - , ; - , - . ( ) - , (, - ). - , . , . . -, , . , , XX . 0.3.2. 300 . . . . , - m n: 1) m - n, . 2) m : m n. 3) m 0, 1), m n. 4) (- ) n. 250 . . . . , , - . , -, 250 . . . . , ( ), - . : . 780-850 . , , Abu Ja'far Mohammed Ben Musa al-Khwarizmi "Hisab al-jabr w'al-muqabala". 1424 . , Ghiyath al-Din Jamshid Mas'ud al-Kashi t 16 . 0.3.3. 1845 . (Gabriel Lame , , , ) , , 5 - . 0 - , 26 1910 . , . 0.3.4. 1900 . ( ) - . 1920-30 . , . 1930 . -. 1936 . , , . ( , .) . XX ( ) , . - , , . , , XXI , . , , , , . 0.4. = ++ , . : - ; - ; - C , ; - , . : , , ? , : 1. = ++, = -++. 2. . 3. ++: ++ . 0.4.1. - . ( , , ), , , . 0 - , 27 , , . - - ( - - ). , , ++, Java. - ( ) , . -, . - , , " ". , . , , . , / , - . - - , , . ( . -, , .). - ( ) ( -). 0.4.2. 1. " " - , , , - . 2. " " - - , , . 3. "" 4. "" "" . , ( ) - "" . - . - , - . , . - , -, . 5. " " 6. " . NP- " 7. " " 8. " " 9. " " 10. "" 0 - , 28 0.4.3. C? - . ( upgrade ++) , , -, . - ( ) "- " Java. , -, "" , Java ( -). : - , - "" , - ( ). , ( ) . , , - , . , , -, - . , ++? upgrade- , . , - ++ , , , . , : , , - , . , , - Algorithms in Pascal, - , ++ Java. - ++. , ? , . : - , - , , - , -: - -. , , . : ( ), , 10 . Delphi. , . informatics, . Borland International , . Delphi . Macintosh ( , ) Linux, Unix . : ++, Java, - . , -- Java, Javascript, Perl, PHP - : , . 0 - , 29 0.4.4. (, , , - ..), , - "" - . DOS ( Borland C++ 3.1), Windows ( Visual C++ 6.0). ANSI . Windows, DOS, - / . 0.5. , , . . 0.5.1. -, , - , , . , " " ( ). , , . SAP Labs Rila Solutions . , ( ), - , - ( , deadline . 22:20 01:55 .). . - ( - ). ( ) , , , ( .). . , - , . , . - , , , , -, , , , , . 0 - , 30 , - , , . - ( -, . ). ( ), -. , . , " " - , bold , - . 0.5.2. , http://www.nakov.com/algoplus-bugs/submit-bug.php: (20), (15), (12), (12), (6), (5), (3), (3), (3), (3), (3), (2), (2), (2), (2), (2), (2), (2), (2), (2), (2), (2), (2), Ka (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1), (1) (1) . 0.5.3. . , , - - , . , , -, (, ) - ( ). : http://www.facebook.com/groups/168112146541301 : [email protected]; [email protected] [email protected]; [email protected] - , . - : http://www.programirane.org : ; , ; ; ; ; ; - . 0 - , 31 1 " : , , , ." ~ 1.1. , -. , - , . 1.1.1. , , , . , , , , . -. , . . - -. - . , , () , - , . , , , , , ax2 + bx + c = 0 . - : A, B, C, ... . , , - ( ). , A a1, a2, ..., an : A = {a1, a2, ..., an} , ai, i = 1,2,...,n, A aieA, aieA. - ( A - n), |A|. n = 0, C. -, ( 1.1.1.): 1 - 34 , (a, b, ) , , , . A - a - b 1.1.1. . , , [,-1973]. , -. 1.1. A - B, A B. _B ( 1.1.1.). - , B , A () B. cB. A B A A B B B A (a) () () () 1.1.1. (), (), () () . 1.2. C A B, a , aeA aeB. C = AB. 1.3. C = AB A B C, , A B. 1.4. C = A\B A B C, , A, B. 1.5. , . . -, . , , . (): {a, a, b} {a, b, b} {a, b, a} {a, b} {b, a} 1.6. , , -. 1.7. n- , - n- (). 1 - 35 n- , . , (a, b, c) (a, c, b) .. : 1. A = {1,2,4,5,7} B = {2,3,4,5,6}. : AB, AB, A\B, B\A. 2. A B , AB = A. B? 3. A B : AB = (AB) \ (AB). A = {1,2,4,5,7} B = {2,3,4,5,6}. 4. - , A - B = B - A. : AB, AB, A\B, B\A, AB? - , - . ( 3 "" : , ), . . , - , , . 1.8. ( N) -, 0, 1, 2, 3, .... , . - : , . , N - , . , n- . 1.9. Z : ..., 3, 2, 1 ( ), 0 (), 1, 2, 3, ... ( ). , [-1995]. - , , . -. ANSI C (American National Standards Institute [ANSIC]) ( 1.1.1. Borland C DOS), -, : |short| s |int| s |long| int ( , DOS 2 , Windows 4). , unsigned, , : (unsigned)(-1). 1 - 36 1.1.1a. Borland C DOS. 1.1.1a. , . , . , ( -) , ( . overflow) . 1.10. p/q, p q q -. Q. 1.11. , : x = n + 0,d1d2d3... , n , di 0 9. 0,d1d2d3... . , k kkkkd d dn xd d dn10110 100 10 10 100 102 1 2 1+ + + + + s s + + + + keN, k > 0. , di . (.. ) . - 1/3 = 0,333333..... 3 . 1/3 = 0,(3) . - , 1/7 = 0,(142857). , , .. p/q (p,qeN, q > 0), t: t = 3,1415926535 .... , t - 355/113, , ( 6 ) . 22/7. : , [-1995]. , - IEEE (Institute of Electrical & Electronics Engineers). , . 1.1.1. Borland C DOS. float 3,4.1038 , ..., 3,4.1038 32 double 1,7.10308 , ..., 1,7.10308 64 long double 3,4.104932 , ..., 1,1.104932 80 char 128, ..., 127 8 unsigned char 0, ..., 255 8 short int 32768, ..., 32767 16 int 32768, ..., 32767 16 long int 2147483648, .., 2147483647 32 unsigned short int 0, ..., 65535 16 unsigned long int 0, ..., 4294967295 32 1 - 37 1.1.1. Borland C. , ( . underflow): ( , ). : 1/3 . , , - c (c > 0) , ( ), - c , 0. : , , - . - . m n , m = 0. q r (0 s r < m) , n = q.m + r. q n/m, r . r , , m n (n m) m|n. ( ) / %. "", : q = n / m; r = n % m; 1.12. (n m) % z = 0, , n m z n m (mod z). n. : ( ) n 10. , n . , n , , n : #include unsigned n = 4242; int main(void) { unsigned digits; for (digits = 0; n > 0; n /= 10, digits++); printf(" %u %u\n", n, digits); return 0; } digits.c : 1. m n, (m,n) : (7,3), (7,3), (7,3), (7,3), (3, 7), (3,7), (3,7), (3,7). 2. m n (m = 0) - n = q.m + r, 0 s r < m, (q, r ). [-1995] 3. . ? 1 - 38 - a1, a2, ... , an. S = a1 + a2 + ... + an - : ==niia S1, s s=n iia S1, ==n iia S.. 1 R(x), i : =) ( : x R iia S C Sn n : unsigned sum(unsigned n) { unsigned i, s = 0; for (i = 1; i 0, y > 0 x. y b logb y. (x > 0, y > 0, b > 0, b 1, c > 0, c 1): ) 4 (logloglog) 3 ( log . log) 2 ( log log ) ( log) 1 ( loglogbxxx y xy x xyb b xccbbybb b bxbxb== + == = - , 2 log x log2 x. ln x log x: H e = 2,71828... ( 1.1.6.) : 1. - , . 2. (1), (2) (3) , . - . n, neN ( n!) 1 n: [== =nii n n1... 2 . 1 ! , 0! = 1. C n! : unsigned long factoriel(unsigned n) { unsigned i; unsigned long r = 1; 1 - 41 for (i = 2; i ==0 , )! 1 .(0 , 1!n n nnn n Sn - : > +==0 ,0 , 01n n SnSnn - ( 1.2.), . : 1. x y (xeR, yeN). 2. - . - ( ). m n (mn) : .. , m n (n > 1, m > 1). m = n . aij : , , ( 1.1.1.). 11 12 ... 1n a21 22 ... a2n m1 am2 ... amn Amn = 1.1.1. mn. , -, , 22, 33, 44 - , ( ) . - - [Ayres-1962]. : int A[m][n]; 1 - 42 - , struct data, : struct data { int a; int b; ... } A[m][n]; / - . - ( 1.1.1.). 11 12 ... 1 n a 21 22 ... a 2 n m 1 a m 2 ... a mn 11 12 ... 1 n a 21 22 ... a 2 n m 1 a m2 ... a mn a) ) 1.1.1. : () () . /* */ for (i = 0; i < m; i++) for (j = 0; j < n; j++) scanf("%d", &A[i][j]); /* */ for (i = 0; i < n; i++) for (j = 0; j < m; j++) scanf("%d", &A[j][i]); /* */ for (i = 0; i < m; i++) { for (j = 0; j < n; j++) printf("%.3d", A[i][j]); printf("\n"); } matrix.c Amn Bmn Cmn , cij = aij + bij ( i = 1, 2,..., m, j = 1, 2, ..., .n), 1.1.1. 11 12 ... 1n a21 22 ... a2n ... m1 am2 ... amn b11 b12 ... b1n b21 b22 ... b2n b m1 bm2 ... bmn Cmn = + = 11+b11 12+ b12 ... 1n+ b1n a21+ b21 22+ b22 ... a2n+ b2n m1+bm1 am2+ bm2 ... amn+ bmn 1.1.1. . for (i = 0; i < m; i++) 1 - 43 for (j = 0; j < n; j++) C[i][j] = A[i][j] + B[i][j]; summat.c Amn Bnp Cmp, : ( )==nkkj ik ijb a c1., i = 1,2,...,m j = 1,2,...,p. -, m.p.n . n > m n > p, n3. for (i = 0; i < m; i++) for (j = 0; j < p; j++) { C[i][j] = 0; for (k = 0; k < n; k++) C[i][j] += A[i][k] * B[k][j]; } multmat.c , , . - , nlog 7 (~ n2,81) , - . , -, 7.6., . : 1. unsigned a[MAX][MAX]. void fillMatrix(unsigned a[][MAX], unsigned n), a[][] : 0 20 19 17 14 1 0 18 16 13 2 5 0 15 12 3 6 8 0 11 4 7 9 10 0 2. unsigned a[MAX][MAX]. , - , n = 5 : 1 16 15 14 13 2 17 24 23 12 3 18 25 22 11 4 19 20 21 10 5 6 7 8 9 1.1.2. : a1, a2, ..., an. - P = a1.a2..an. , ai = i, i = 1,2,...,n, P = 1.2 ... n = n!. 1 - 44 , 1.1.1., . n!. n! , -. 10! e 3628800, . 20! C. - , , , : P ((

+=niia110log 1, [x] - , - x. , , P [1+log10(P)], - : log P = log(a1.a2. an) = log a1 + log a2 + + log an. n! #include #include const unsigned long n = 123; int main(void) { double digits = 0; unsigned i; for (i = 1; i 2 . 2. n > 17 . 3. - . 4. n > 5 . 5. . . n2+m2 n2+m2+1. . n2+1. . () n2 (n+1)2 . : 1. t(x) - , -? 2. . 3. . - , , : [2, 2p1] p , , , p . 1 - 46 , , , - . (). p , (p1)! 1 (mod p). (p1)!, - - 2p1 . , 2p1: p(). , , p x, x > p, , p p = x.y, y < p, .. - p. : #include #include const unsigned n = 23; char isPrime(unsigned n) /* 1, , 0 */ { unsigned i = 2; if (n == 2) return 1; while (i 1, i 2). , . - : #include unsigned n = 435; /* , */ int main(void) { unsigned how, i, j; printf("%u = ", n); i = 1; while (n != 1) { i++; how = 0; while (0 == n % i) { how++; n = n / i; } for (j = 0; j < how; j++) printf("%u ", i); } printf("\n"); return 0; } numdev.c : . - , : a1, a2, ..., an. , P = a1.2. ... .an. 1.1.2., - . , : , , 2 5, , 2, , 5. , , : 1) i (i = 1, 2,..., n) ai ai = 2Mi.5Ni.bi, bi % 2 = 0, bi % 5 = 0. 2) P = cn iin iiN M. 5 . 2.. 1 .. 1 = =, (c ), a =niMi1 =niNi1. , : 25, 4, 20, 11, 13, 15 1 - 52 : 20.52.1, 22.50.1, 22.51.1, 20.50.11, 20.50.13, 20.51.3, 4 . : 25.4.20.11.13.15 = 4290000. - . . n!. = ((

] [log155nkkn. - , 2 5 n . #include const unsigned n = 10; int main(void) { unsigned zeroes = 0, p = 5; while (n >= p) { zeroes += n / p; p *= 5; } printf(" %u! %u\n", n, zeroes); return 0; } factzero.c : 1. , . 2. , - . 3. , n! 1.1.4. - 1.15. , 2p1, p e . 39 p, 2p1 : 2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607, 1279, 2203, 2281, 3217, 4253, 4423, 9689, 9941, 11213, 19937, 21701, 23209, 44497, 86243, 110503, 132049, 216091, 756839, 859433, 1257787, 1398269, 2976221, 3021377, 6972593, 13466917 37 p 37 . ( 1999 2001 .), 38- 39-, , -. p. .. - . : , - . , . 23- 1963 ., , 1 - 53 "2112131 " ( 1.1.4.). - , , : 2134669171 8107892 (??39- M ) 269725931 2098960 (??38- M ) 230213771 909526 (37- M ) 229762211 895932 (36- M ) 213982691 420921 (35- M ) - , - . , ( -). - : , "" 38- , $50000. $250000 [Primes-3]. 1.1.4. 211213-1 . : p = 2, 3, 5, 7, 11, = 2p 1 . , . 1870 , - - , ( e - [Guinier-1991]). (LucasLehmer Test, 1930) : : 1 = 4 n+1 = (En )2 2 : 4, 14, 194, 37634, . (-). m = 2p 1 ( p ) , : (Ep1) % (2p 1) = 0 - . . : 1. n , -. 2. n , -. . 3. 2n1 , n ? 1 - 54 - . 1.16. n , ( n ). 3 : 6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14, 496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248. : 8128, 33550336, 8589869056, , ( n = 1, 2, 3, ), 5- . : . () 2p1 , 2p1.(2p1) . n - : pi n ( 10 2, 3, 5, 7, 13, 17, 19, 31, 61, 89). , n, . , : 2 . number[]: . : number[k-1] ( k ), number[k-2] .. k- number[0]. , number[], : i = 0; number[i]++; while (10 == number[i]) { number[i] = 0; number[++i]++; } if (i == k) k++; 2, , .. 9, - , while(10 == number[i]), . , : unsigned i, carry = 0, temp; for (i = 0; i < k; i++) { temp = number[i] * 2 + carry; number[i] = temp % 10; carry = temp / 10; } if (carry > 0) number[k++] = carry; , 10 , - mPrimes[]: #include #define MN 10 unsigned mPrimes[MN] = { 2, 3, 5, 7, 13, 17, 19, 31, 61, 89 }; unsigned k, number[200]; void doubleN(void) { unsigned i, carry = 0, temp; 1 - 55 for (i = 0; i < k; i++) { temp = number[i] * 2 + carry; number[i] = temp % 10; carry = temp / 10; } if (carry > 0) number[k++] = carry; } void print(void) { unsigned i; for (i = k; i > 0; i--) printf("%u", number[i-1]); printf("\n"); } void perfect(unsigned s, unsigned m) { unsigned i; k = 1; number[0] = 1; for (i = 0; i < m; i++) doubleN(); /* 2^i */ number[0]--; /* {2,4,8,6} */ for (i = 0; i < m - 1; i++) doubleN(); printf("%2u-o = ", s); print(); /* */ } int main(void) { unsigned i; for (i = 1; i = 0) */ /* base */ { char *saveRslt = rslt; while (n > 0) { *rslt++ = getChar((char)(n % base)); n /= base; } *rslt = '\0'; reverse(saveRslt); } base.c - 1, , p. A p- : - A p, . - 0,125 : 0,125.2=0,25.2=0,5.2=1,0 0,125(10) = 0,001(2). A p- () . - . convertLessThan1() A (0 s < 1) cnt , . void convertLessThan1(char *rslt, double n, unsigned char base, unsigned char cnt) /* 0 1 0 s < 1, , , . convertReal(): void convertReal(char *rslt, double n, unsigned char base, unsigned char cnt) /* n base */ { double integer, fraction; 1 - 63 /* */ if (n < 0) { *rslt++ = '-'; n = -n; } /* */ fraction = modf(n, &integer); /* */ convert(rslt, (unsigned long)integer, base); /* ( ...) */ if ('\0' == *rslt) *rslt++ = '0'; else rslt += strlen(rslt); *rslt++ = '.'; /* */ convertLessThan1(rslt, fraction, base, cnt); if ('\0' == *rslt) { *rslt++ = '0'; *rslt = '\0'; } } base.c : 1. 157 : 3;5;7;14. 2. 0,321 : 3;5;7;14. 3. 157,321 : 3;5;7;14. 4. - p- . 5. p- . - p- . p- - A, . , , 12734(8), - : 12734(8) = 1.84 + 2.83 + 7.82 + 3.8 + 4 = 5596(10) , 10 . - , 8, . - , n- n . (1) (2). (1) Pn(x) = a0xn+a1xn-1+...+an-1x+an (2) Pn(x) = an+x(an-1+x(an-2+...+x(a2+x(a1+xa0))...)) calculate(): 1 - 64 char getValue(char c) /* c */ { return (c >= '0' && c = 0 */ { unsigned long result; for (result = 0; '\0' != *numb; numb++) result = result*base + getValue(*numb); return result; } base.c , - 1. . , p. double calculateLessThan1(const char *numb, unsigned char base) /* numb (0 < numb < 1), base */ { const char *end; double result; for (end = numb + strlen(numb) - 1, result = 0.0; end >= numb; end--) result = (result + getValue(*end)) / base; return result; } base.c , , : double calculateReal(char *numb, unsigned char base) /* numb, base */ { char *pointPos; char minus; double result; /* */ if ('-' == *numb) { minus = -1; numb++; } else minus = 1; if (NULL == (pointPos = strchr(numb, '.'))) return calculate(numb, base); /* */ /* */ *pointPos = '\0'; result = calculate(numb, base); *pointPos = '.'; /* */ result += calculateLessThan1(pointPos+1, base); return minus*result; 1 - 65 } base.c : 1. 126(8); 10101(2); 3F2B(16); 3CB(14). 2. 0,233(8); 0,01(2); 0,34(16); 0,2A(14). 3. 126,233(8); 10101,01(2); 3F2B,34(16); 3CB,2A(14). 4. p- . 1.1.7. - , , - : . , . , - , -, . . [1;3999] 7 ( ): I(1), V(5), X(10), L(50), C(100), D(500) M(1000). 1989 MCMLXXXIX. - . - , - -, . : XI = 10 + 1 = 11 IX = 10 1 = 9 - . , - - . 1.1.7. 1(I) 2(II) 3(III) 4(IV) 5(V) 6(VI) 7(VII) 8(VIII) 9(IX) 10(X) 20(XX) 30(XXX) 40(XL) 50(L) 60(LX) 70(LXX) 80(LXXX) 90(XC) 100(C) 200(CC) 300(CCC) 400(CD) 500(D) 600(DC) 700(DCC) 800(DCCC) 900(CM) 1.1.7. . 1.1.7. . -, , - . , , 3(III), 30(XXX) 300(CCC). 7(VII), 70(LXX) 700(DCC). , , - . , ( ) , , , , . - - , . , - decimal2Roman(). 1 - 66 -: const char *roman1_9[]={"", "A", "AA", "AAA", "AB", "B", "BA", "BAA", "BAAA", "AC"}; const char *romanDigits[] = {"IVX", "XLC", "CDM", "M" }; A, B C 1.1.7., . void getRomanDigit(char *rslt, char x, unsigned char power) { const char *pch; for (pch = roman1_9[x]; '\0' != *pch; pch++) *rslt++ = romanDigits[power][*pch - 'A']; *rslt = '\0'; } char *decimal2Roman(char *rslt, unsigned x) { unsigned char power; char buf[10]; char oldRslt[MAX_ROMAN_LEN]; for (*rslt = '\0', power = 0; x > 0; power++, x /= 10) { getRomanDigit(buf, (char)(x % 10), power); strcpy(oldRslt, rslt); strcpy(rslt,buf); strcat(rslt,oldRslt); } return rslt; } rom2dec.c : 1. : 10; 19; 159; 763; 1991; 1979; 1997; 2002. 2. : 0; 10; 0,28; 3,14; 1/7. 3. . - -. -, - , . , - , , - , . , 2 : if (value > old) rslt -= 2*old; 19(XIX) I , 21(XXI) . : roman2Decimal() ? , . . . unsigned roman2Decimal(const char *roman, char *error) { unsigned rslt, value, old; 1 - 67 const char *saveRoman = roman; char buf[MAX_ROMAN_LEN]; old = 1000; rslt = 0; while ('\0' != *roman) { switch (*roman++) { case 'I': value = 1; break; case 'V': value = 5; break; case 'X': value = 10; break; case 'L': value = 50; break; case 'C': value = 100; break; case 'D': value = 500; break; case 'M': value = 1000; break; default: *error = 1; return (unsigned)(-1); } rslt += value; if (value > old) rslt -= 2*old; old = value; } return (*error = strcmp(saveRoman,decimal2Roman(buf,rslt))) ? (unsigned)(-1) : rslt; } dec2rom.c : 1. : DCLXXXIV, DCCLXIV, LX, LXX, LXXX, XL, XXL, XXXL. 2. . 3. , . 1.1.7. 1.2. : - , . UNIX "" ( GNU GNU is Not UNIX, WINE WINE Is Not an Emulator, .). 1.18. , , - . - -: , . . , , . . P , , . - 1 - 68 - : P1 P2, P2 P3, , Pn P1. , P1, P2, P3, ..., Pn, () -. : - , , , () . - . - , , , .. ( ), . , . - "" , .. (-, , , .). , , - . 1.2.1. , , 1.1.1. , , , : - n = 0 1. - n1 n. ( n 0 ). C, n!: #include const unsigned n = 6; unsigned long fact(unsigned i) { if (i < 2) return 1; return i * fact(i - 1); } int main(void) { printf("%u! = %lu \n", n, fact(n)); return 0; } factrec.c n ( 1.1.1.): unsigned long sum(unsigned n) { if (0 == n) return 0; else return n + sum(n - 1); } 1 - 69 : , , () -, -, . ( 1.2.2.) , : , . - n.sizeof(unsigned) n . : n! 1.1.1. - , , .. - . , n! - unsigned long, . 1.2.2. . , , , , , . 1.2.2. . , , . ? , 1 - 70 , . , , , , , . , : , , , , ( 1.2.2.) , . K ? : 0,1,1,2,3,5,8,13,21,34,55,89,..., , 0 1, .. : F0 = 0, F1 = 1, Fi = Fi-1 + Fi-2 1.2.2. . ( ), (Filius Bonaccii, .. ), 1202 . Liber Abacci ( ) . , : - ; - ; - . , , 3 , 5 ( , ), 8 .. , - . ( 1.2.2.). 1 - 71 1.2.2. . - 1611 . , , - ( 1.2.2.). , - , , - , . 1.2.2. . ? - , - ( , ). -, 1845 . ( 1.2.3.) - . . 61803 , 125 1=+= | | - -. A B, : 1 - 72 ( ) | =+=AB ABA - | , XIX- : . | , . - . , |, . ( 1.2.2.) : , , , - 1, 0. , - . 1.2.2. . - , n- , , - : unsigned long fib(unsigned n) { if (n < 2) return 1; else return fib(n - 1) + fib(n - 2); } fibrec.c , - . , n = 40. , ( n = 0 1), . . , - ( 1.2.2.). 1 - 73 1.2.2. . , -. , , .. . , F10 F8 F10 = F9 + F8 F9 = F8 + F7. - -. - , , . ( memoization) 8 . , , - : - , . , : unsigned long fibIter(unsigned n) { unsigned long fn = 1, fn_1 = 0, fn_2; while (n--) { fn_2 = fn_1; fn_1 = fn; fn = fn_1 + fn_2; } return fn_1; } fib2.c , : unsigned long fibIter2(unsigned n) { unsigned long f1 = 0, f2 = 1; while (n--) { f2 = f1 + f2; f1 = f2 - f1; } return f1; } fib2.c , n , - - . , n- ? 1 - 74 , ( 1.4.8.): (((

||.|

\| ||.|

\| +=n nnF25 125 1.51 - n- . , - -, . n -, ( 7.3., [-1998c]). , 5 - . , , . n- 8 ( 8.1.), - . : 1. , . 2. n- : . 1.2.3. - . - () . 1.19. a b. , d - - b, , a b. , : 1) d|a, d|b 2) d1|a d1|b, d1|d. : d|a , d a . : d1 a b d. - a b (a,b) (a,b). : (12, 8) = (8, 12) = (8, 4) = 4, (1, 10) = (7, 10) = 1. 1.20. 1, . - : (a1, a2, ..., an) = ((a1, a2, ..., an1), an) (a,b), . - : 1) a > b, 4), 2). 2) a = b , (a,b) b . a = b 3). 1 - 75 3) b = b a 1). 4) a = a b 1). - , , , -. ( ): a b, q1 r1. - b , r1 r2 .., : a = q1.b + r1 b = q2.r1 + r2 r1 = q3.r2 + r3 ... rk1 = qk+1.rk + rk+1, rk+1 = 0 rk . - , : (a, b) = (b, a % b) b = 0 ( (a, 0) = a) , , b 0 . ( ) - : unsigned gcd(unsigned a, unsigned b) { unsigned swap; while (b > 0) { swap = b; b = a % b; a = swap; } return a; } gcditer.c unsigned gcd(unsigned a, unsigned b) { return (0 == b) ? a : gcd(b, a % b); } gcdrec.c , - . : -, . , , - x y (x, yeZ), , : d = (a,b) = ax + by : 1. : (10,5); (5,10); (15,25); (25,15); (7,8,9); (3,6,9); (158,128,256); (64,28,72,18). 1 - 76 2. . 10/15 2/3. 3. , (a1, a2, ..., an) = ((a1, a2, ..., an1), an). 4. . 5. , (a, b) = (b, a % b). 6. , a b, x y (x, yeZ), (a,b) = ax + by? 7. , . 2; 5; 100; 1000 . 8. ( ) a, b c , a, b c , c > a > b, c > a + b 1, - , . d , d 0 < d s a. , / - . 1.2.4. - 1.21. a b. d (d > 0) , a|d b|d - () a b. - a b (a,b) [a,b]. : [6, 15] = [15, 6] = 30, [1, 10] = 10, [5,10] = 10, [5, 12] = 60. , : (a1, a2, ..., an) = ((a1, a2, ..., an1), an) - , , : ) , (.) , (b a b ab a = - n . [] , , lcm(): #include const unsigned n = 4; const unsigned A[] = { 10, 8, 5, 9 }; unsigned gcd(unsigned a, unsigned b) { return (0 == b) ? a : gcd(b, a % b); } unsigned lcm(unsigned a[], unsigned n) { unsigned b; if (2 == n) return(a[0] * a[1]) / (gcd(a[0], a[1])); else { b = lcm(a, n - 1); return(a[n - 1] * b) / (gcd(a[n - 1], b)); } } 1 - 77 int main(void) { printf("%u\n", lcm(A, n)); return 0; } lcm.c : 360 : 1. : [10,15]; [15,10]; [7,8,9]; [3,6,9]; [158,128,256]; [64,28,72,18]. 2. , [a1, a2, ..., an] = [[a1, a2, ..., an1], an]. 3. , [a,b] = ab / (a,b). 4. , . 2; 5; 100; 1000 . 1.2.5. C, , . . : n, , . , n = 7892 : 7, 8, 9, 2. . , : n%10 n/10. : - . , : #include unsigned n = 7892; int main(void) { unsigned dig[20], i, k = 0; while (n > 0) { dig[k] = n % 10; n = n / 10; k++; } for (i = k; i > 0; i--) printf("%u ", dig[i-1]); printf("\n"); return 0; } print.c - -. : 7892, 789 2. , n, (!) n/10 n%10. , , 1 - 78 . : void printN(unsigned n) { if (n >= 10) printN(n / 10); printf("%u ", n % 10); } printrec.c , , n s 9, .. - n . . - -. , , . - : n! , i ( , ): #include const unsigned n = 6; unsigned i; unsigned long fact(void) { if (1 == i) return 1; return --i * fact(); } int main(void) { i = n + 1; printf("%u! = %lu \n", n, fact()); return 0; } factrec.c : "" return --i * fact(); : factrec.c Borland C DOS, Microsoft Visual C++ Windows. : n - 10k (1 s k s n). , n = 5 : 10, 100, 1000, 10000, 100000, 100000, 10000, 1000, 100, 10 . : 1. ( n) : #include const unsigned n = 5; void printRed(unsigned k, unsigned long result) { printf("%lu ", result); if (k < n) printRed(k + 1, result * 10); printf("%lu ", result); } 1 - 79 int main(void) { printRed(1, 10); printf("\n"); return 0; } print1.c 2. - k : #include const unsigned n = 5; unsigned k = 0; void printRed(unsigned long result) { k++; printf("%lu ", result); if (k < n) printRed(result * 10); printf("%lu ", result); } int main(void) { printRed(10); printf("\n"); return 0; } print2.c 3. result , : #include const unsigned n = 5; unsigned long result = 1; unsigned k = 0; void printRed(void) { k++; result *= 10; printf("%lu ", result); if (k < n) printRed(); printf("%lu ", result); result /= 10; } int main(void) { printRed(); printf("\n"); return 0; } print3.c , ( -), - . : 1 - 80 1. factrec.c Borland C DOS Microsoft Visual C++ Windows. ? 2. -. Borland C DOS Microsoft Visual C++ Windows? ? unsigned i = 1; printf("%u %u", ++i, i); : unsigned i = 1; printf("%u %u", i, ++i); 3. x -. Borland C DOS Microsoft Visual C++ Windows? ? unsigned x, a = 3, b = 5; x = a+++b; 4. . 1.3. , , - () . . ( ) . -, : , .. , 52 , 5 , ( : ). - , 9. - : - , . - , ( ) . 1.3.1. 1.22. n- A = {a1, a2, ..., an}. n-, A, A , . Pn, |Pn|. , |Pn| = n! , e {a, b, c} 3 , - (.. n-) : 1 - 81 (a, b, c) (a, c, b) (b, a, c) (b, c, a) (c, a, b) (c, b, a) , , 1 n. ( n- n ). - : 1: , n1 n1 . : /* i */ void permute(i) { if (i >= n) { /* */ printPerm(); } else for (k = 0; k < n; k++) if (!used[k]) { /* k */ used[k] = 1; /* k */ position[i] = k; /* i k */ permute(i+1); used[k] = 0; /* k */ } } permute() : , "" -. i- , - , (i+1)- . - used[], : - , used[k] == 1, used[k] == 0, (.. ""). i == n , . , n! n (n ): #include #define MAXN 100 const unsigned n = 3; char used[MAXN]; unsigned mp[MAXN]; void print(void) { unsigned i; for (i = 0; i < n; i++) printf("%u ", mp[i] + 1); printf("\n"); } 1 - 82 void permute(unsigned i) { unsigned k; if (i >= n) { print(); return; } for (k = 0; k < n; k++) { if (!used[k]) { used[k] = 1; mp[i] = k; permute(i+1); /* if ( ) { permute(i+1); } */ used[k] = 0; } } } int main(void) { unsigned i; for (i = 0; i < n; i++) used[i] = 0; permute(0); return 0; } permute.c : 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 -, if. , , - , , . - ( 6) , . : , - , : ki i- , 2010 1== s sik iiik. , . , , 20, - , . - . , (i1, i2, , in) (j1, j2, ,jn) k (1 s k < n) , ip = jp, p = 1, 2, , k1 ik < jk. -, : - , -. : k+1 k, . - used[]. , - [-1998]: 2: 1) n = 1 : (1). 1 - 83 2) (p1, p2,, pk), k (1 s k < n) . (k+1) 1,2, , (k+1)- : (pk+1,p1,p2,,pk) (p1, pk+1,p2,,pk) (p1,p2,,pk, pk+1) , 2) k , - k+1 . - 2. - , -. #include #define MAXN 100 const unsigned n = 3; unsigned a[MAXN]; void print(void) { unsigned i; for (i = 0; i < n; i++) printf("%u ", a[i] + 1); printf("\n"); } void permut(unsigned k) { unsigned i, swap; if (k == 0) print(); else { permut(k - 1); for (i = 0; i < k - 1; i++) { swap = a[i]; a[i] = a[k-1]; a[k-1] = swap; permut(k - 1); swap = a[i]; a[i] = a[k-1]; a[k-1] = swap; } } } int main(void) { unsigned i; for (i = 0; i < n; i++) a[i] = i; permut(n); return 0; } permswap.c : 1 2 3 2 1 3 3 2 1 2 3 1 1 3 2 3 1 2 : 1. , n- n! 2. {a,b,c,d}, : ) 1 1 - 84 ) 2 . 3. 1 2. 4. , permswap.c 2. 5. . - , ( 9) memoization ( 8) . , - . , : (1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1). 0 5. , n- 0 n!1. ( ) () [-1995]: 1) perm[] n, , . 2) pos = result = 0, p[] n , p[i] = i+1, i = 0,1, ..., n1. 3) pos < n, , r- p, r i, i , perm[pos] == p[i]. result . 4) result = result*(n pos) + r. 5) pos++ 3). 1) num . k = n-1, p[] n- , p[i1] = i, i = 1, 2, ..., n. 2) k > 0 : m = n - k; perm[k] = num % m; if (k > 0) num /= m; k--; 3) k = 0. k < n : m = perm[k]; perm[k] = p[m]; if (k < n) for (i = m+1; i < n; i++) p[i-1] = p[i]; k++; , : #include #define MAXN 100 const unsigned n = 6; const unsigned perm[MAXN] = { 5, 3, 6, 4, 2, 1 }; const unsigned long code = 551; 1 - 85 unsigned long codePerm(unsigned n, const unsigned perm[]) { unsigned p[MAXN], i, pos; unsigned long r, result; result = 0; for (i = 0; i < n; i++) p[i] = i + 1; for (pos = 0; pos < n; pos++) { r = 0; while (perm[pos] != p[r]) r++; result = result * (n - pos) + r; for (i = r + 1; i < n; i++) p[i - 1] = p[i]; } return result; } void decodePerm(unsigned long num, unsigned n, unsigned perm[]) { unsigned long m,