Thao tác số nguyên lớn – Trình bày thuật toán và cách thực hiện

  1.  

    //xay dung lop quan ly so lon

  2. # include<iostream.h>

  3. # include<conio.h>

  4. # include<string.h>

  5. # include<stdlib.h>

  6. # include<ctype.h>

  7. class

    big_int

  8.  

    {

  9.    

    private

    :

  10.      

    int

    a

    [

    100

    ]

    ;

    //chuoi so

  11.      

    int

    n

    ;

         

    //so ky tu co nghia

  12.      

    int

    dau

    ;

       

    //dau cua so

  13.    

    public

    :

  14.      

    int

    nhap

    (

    )

    ;

  15.      

    void

    in

    (

    )

    ;

  16.      big_int

    (

    )

    ;

  17.      big_int

    (

    int

    b,

    int

    c

    )

    ;

  18.      big_int congcungdau

    (

    big_int b

    )

    ;

  19.      big_int congkhacdau

    (

    big_int b

    )

    ;

  20.      big_int

    operator

    +

    (

    big_int b

    )

    ;

  21.      big_int

    operator

    (

    big_int b

    )

    ;

  22.      big_int

    operator

    *

    (

    big_int b

    )

    ;

  23.      

    void

    chia

    (

    big_int b,big_int c,big_int

    &

    d

    )

    ;

  24.      

    int

    sosanh

    (

    big_int b

    )

    ;

  25.      

    void

    dich

    (

    int

    b

    )

    ;

  26.      big_int nhan

    (

    int

    b

    )

    ;

  27.      

    void

    xoa0

    (

    )

    ;

  28.      big_int giaithua

    (

    )

    ;

  29.  

    }

    ;

  30. //ham tao———————————————————————-

  31. big_int

    ::

    big_int

    (

    int

    b,

    int

    c

    )

  32.  

    {

  33.     n

    =

    b

    ;

  34.    

    for

    (

    int

    i

    =

    0

    ;

    i

    <

    100

    ;

    i

    ++

    )

  35.      

    {

  36.        

    if

    (

    i

    <

    n

    )

    a

    [

    i

    ]

    =

    c

    ;

  37.        

    else

    a

    [

    i

    ]

    =

    0

    ;

  38.      

    }

  39.  

    }

  40. //xoa cac ky tu 0 vo nghia 00001234->1234————————————-

  41. void

    big_int

    ::

    xoa0

    (

    )

  42.  

    {

  43.    

    int

    i

    =

    n

    1

    ,dem

    =

    0

    ;

  44.     i

    =

    n

    1

    ;

  45.    

    while

    (

    i

    )

  46.      

    {

  47.        

    if

    (

    a

    [

    i

    ]

    )

    break

    ;

  48.        

    else

  49.        

    {

    dem

    ++

    ;

    a

    [

    i

    ]

    =

    NULL

    ;

    }

  50.         i

    ;

  51.  

  52.      

    }

  53.     n

    =

    n

    dem

    ;

  54.  

    }

  55. //nhan mot chuoi voi 1 so—————————————————–

  56. big_int big_int

    ::

    nhan

    (

    int

    b

    )

  57.  

    {

  58.     big_int c

    ;

  59.    

    int

    i,nho

    =

    0

    ;

  60.     c.

    n

    =

    n

    ;

  61.    

    for

    (

    i

    =

    0

    ;

    i

    <

    n

    ;

    i

    ++

    )

  62.      

    {

  63.         c.

    a

    [

    i

    ]

    =

    (

    a

    [

    i

    ]

    *

    b

    +

    nho

    )

    %

    10

    ;

  64.         nho

    =

    (

    a

    [

    i

    ]

    *

    b

    +

    nho

    )

    /

    10

    ;

  65.      

    }

  66.    

    if

    (

    nho

    )

  67.      

    {

  68.         a

    [

    c.

    n

    ]

    =

    nho

    ;

  69.         c.

    n

    ++

    ;

  70.      

    }

  71.      c.

    dau

    =

    dau

    ;

  72.      

    return

    c

    ;

  73.  

    }

  74. //nhan hai so lon—————————————————————-

  75. big_int big_int

    ::

    operator

    *

    (

    big_int b

    )

  76.  

    {

  77.     big_int c,d

    ;

  78.    

    int

    i

    ;

  79.    

    for

    (

    i

    =

    0

    ;

    i

    <

    b.

    n

    ;

    i

    ++

    )

  80.      

    {

  81.         d

    =

    nhan

    (

    b.

    a

    [

    i

    ]

    )

    ;

  82.         d.

    dich

    (

    i

    )

    ;

  83.         c

    =

    c

    +

    d

    ;

  84.      

    }

  85.    

    if

    (

    dau

    ==

    b.

    dau

    )

    c.

    dau

    =

    0

    ;

  86.    

    else

    c.

    dau

    =

    1

    ;

  87.    

    return

    c

    ;

  88.  

    }

  89. //nhan day so voi  10^b————————————————————-

  90. void

    big_int

    ::

    dich

    (

    int

    b

    )

  91.  

    {

  92.    

    for

    (

    int

    i

    =

    n

    1

    ;

    i

    >=

    0

    ;

    i

    )

     a

    [

    i

    +

    b

    ]

    =

    a

    [

    i

    ]

    ;

  93.    

    for

    (

    i

    =

    0

    ;

    i

    <

    b

    ;

    i

    ++

    )

     a

    [

    i

    ]

    =

    0

    ;

  94.     n

    =

    n

    +

    b

    ;

  95.  

    }

  96. //so sanh tri tuyet doi 2 so——————————————————

  97. int

    big_int

    ::

    sosanh

    (

    big_int b

    )

  98.  

    {

  99.    

    if

    (

    n

    >

    b.

    n

    )

    return

    1

    ;

  100.    

    if

    (

    n

    <

    b.

    n

    )

    return

    1

    ;

  101.    

    else

  102.      

    {

  103.        

    int

    s

    =

    0

    ;

  104.        

    for

    (

    int

    i

    =

    n

    ;

    i

    >=

    0

    ;

    i

    )

  105.          

    {

  106.          

    if

    (

    a

    [

    i

    ]

    >

    b.

    a

    [

    i

    ]

    )

  107.            

    {

  108.             s

    =

    1

    ;

    break

    ;

  109.            

    }

  110.          

    if

    (

    a

    [

    i

    ]

    <

    b.

    a

    [

    i

    ]

    )

  111.            

    {

  112.             s

    =

    1

    ;

    break

    ;

  113.            

    }

  114.          

    }

  115.        

    return

    s

    ;

  116.      

    }

  117.  

    }

  118. //ham tao———————————————————————-

  119. big_int

    ::

    big_int

    (

    )

  120.  

    {

  121.    

    for

    (

    int

    i

    =

    0

    ;

    i

    <

    100

    ;

    i

    ++

    )

  122.     a

    [

    i

    ]

    =

    0

    ;

  123.     n

    =

    0

    ;

    dau

    =

    0

    ;

  124.  

    }

  125. //nhap chuoi thanh cong tra ve 1 neu khong tra ve 0—————————-

  126. int

    big_int

    ::

    nhap

    (

    )

  127.  

    {

  128.    

    int

    i

    ;

  129.    

    char

    c

    [

    100

    ]

    ;

  130. cout

    <<

    “nhap so “

    ;

  131. cin

    .

    ignore

    (

    0

    )

    ;

  132. cin

    .

    get

    (

    c,

    100

    )

    ;

    c,

  133.    

    if

    (

    c

    [

    0

    ]

    !

    =

    ‘-‘

    &&

    (

    !

    isdigit

    (

    c

    [

    0

    ]

    )

    )

    )

     

    return

    0

    ;

  134.    

    for

    (

    i

    =

    1

    ;

    i

    <

    strlen

    (

    c

    )

    ;

    i

    ++

    )

  135.        

    if

    (

    !

    isdigit

    (

    c

    [

    i

    ]

    )

    )

    return

    0

    ;

  136.    

    if

    (

    c

    [

    0

    ]

    ==

    ‘-‘

    )

  137.      

    {

  138.         dau

    =

    1

    ;

  139.        

    for

    (

    i

    =

    strlen

    (

    c

    )

    1

    ;

    i

    >

    0

    ;

    i

    )

  140.          

    {

  141.          

    char

    *

    b

    ;

  142.           b

    [

    0

    ]

    =

    c

    [

    i

    ]

    ;

  143.           a

    [

    strlen

    (

    c

    )

    i

    1

    ]

    =

    atoi

    (

    b

    )

    ;

  144.          

    }

  145.      

    }

  146.    

    else

  147.      

    {

  148.         dau

    =

    0

    ;

  149.        

    for

    (

    i

    =

    0

    ;

    i

    <

    strlen

    (

    c

    )

    ;

    i

    ++

    )

  150.          

    {

  151.          

    char

    *

    b

    ;

  152.           b

    [

    0

    ]

    =

    c

    [

    i

    ]

    ;

  153.           a

    [

    strlen

    (

    c

    )

    i

    1

    ]

    =

    atoi

    (

    b

    )

    ;

  154.          

    }

  155.      

    }

  156.     n

    =

    strlen

    (

    c

    )

    dau

    ;

  157.    

    return

    1

    ;

  158.  

    }

  159. //in chuoi so——————————————————————

  160. void

    big_int

    ::

    in

    (

    )

  161.  

    {

  162. if

    (

    dau

    )

    cout

    <<

    “-“

    ;

    dau

  163.    

    for

    (

    int

    i

    =

    n

    1

    ;

    i

    >=

    0

    ;

    i

    )

  164. cout

    <<

    a

    [

    i

    ]

    ;

  165.  

    }

  166. //ham cong 2 so cung dau——————————————————-

  167. big_int big_int

    ::

    congcungdau

    (

    big_int b

    )

  168.  

    {

  169.     big_int c

    ;

  170.    

    if

    (

    n

    >

    b.

    n

    )

    c.

    n

    =

    n

    ;

    else

    c.

    n

    =

    b.

    n

    ;

  171.    

    int

    nho

    =

    0

    ;

  172.    

    for

    (

    int

    i

    =

    0

    ;

    i

    <

    c.

    n

    ;

    i

    ++

    )

  173.      

    {

  174.         c.

    a

    [

    i

    ]

    =

    (

    b.

    a

    [

    i

    ]

    +

    a

    [

    i

    ]

    +

    nho

    )

    %

    10

    ;

  175.         nho

    =

    (

    a

    [

    i

    ]

    +

    b.

    a

    [

    i

    ]

    +

    nho

    )

    /

    10

    ;

  176.      

    }

  177.    

    if

    (

    nho

    )

  178.    

    {

  179.     c.

    a

    [

    c.

    n

    ]

    =

    nho

    ;

  180.     c.

    n

    =

    c.

    n

    +

    1

    ;

  181.    

    }

  182.     c.

    dau

    =

    dau

    ;

  183.    

    return

    c

    ;

  184.  

    }

  185. //ham cong 2 so khac dau——————————————————-

  186. big_int big_int

    ::

    congkhacdau

    (

    big_int b

    )

  187.  

    {

  188.     big_int c,d,e,g

    =

    (

    *

    this

    )

    ;

  189.    

    if

    (

    n

    >

    b.

    n

    )

    c.

    n

    =

    n

    ;

  190.    

    else

    c.

    n

    =

    b.

    n

    ;

  191.    

    if

    (

    g.

    sosanh

    (

    b

    )

    ==

    1

    )

  192.      

    {

    d

    =

    b

    ;

    e

    =

    g

    ;

    }

  193.    

    if

    (

    g.

    sosanh

    (

    b

    )

    ==

    1

    )

  194.      

    {

    d

    =

    g

    ;

    e

    =

    b

    ;

    }

  195.    

    if

    (

    !

    g.

    sosanh

    (

    b

    )

    )

  196.      

    {

  197.         c.

    a

    [

    0

    ]

    =

    0

    ;

    n

    =

    1

    ;

  198.         dau

    =

    0

    ;

  199.      

    }

  200.    

    int

    muon

    =

    0

    ;

  201.    

    for

    (

    int

    i

    =

    0

    ;

    i

    <

    e.

    n

    ;

    i

    ++

    )

  202.      

    {

  203.        

    if

    (

    d.

    a

    [

    i

    ]

    +

    muon

    <=

    e.

    a

    [

    i

    ]

    )

  204.          

    {

  205.           c.

    a

    [

    i

    ]

    =

    e.

    a

    [

    i

    ]

    d.

    a

    [

    i

    ]

    muon

    ;

  206.           muon

    =

    0

    ;

  207.          

    }

  208.        

    else

  209.          

    {

  210.           c.

    a

    [

    i

    ]

    =

    (

    10

    +

    e.

    a

    [

    i

    ]

    d.

    a

    [

    i

    ]

    muon

    )

    ;

  211.           muon

    =

    1

    ;

  212.          

    }

  213.      

    }

  214.     c.

    dau

    =

    e.

    dau

    ;

  215.    

    return

    c

    ;

  216.  

    }

  217. //nap chong toan tu + ————————————————————–

  218. big_int big_int

    ::

    operator

    +

    (

    big_int b

    )

  219.  

    {

  220.     big_int c

    ;

  221.    

    if

    (

    dau

    ==

    b.

    dau

    )

    c

    =

    congcungdau

    (

    b

    )

    ;

  222.    

    else

    c

    =

    congkhacdau

    (

    b

    )

    ;

  223.    

    return

    c

    ;

  224.  

    }

  225. //nap chong toan tu (-) ——————————————————-

  226. big_int big_int

    ::

    operator

    (

    big_int b

    )

  227.  

    {

  228.     big_int c

    ;

  229.    

    if

    (

    dau

    ==

    b.

    dau

    )

    c

    =

    congkhacdau

    (

    b

    )

    ;

  230.    

    else

    c

    =

    congcungdau

    (

    b

    )

    ;

  231.    

    return

    c

    ;

  232.  

    }

  233. //phep chia tra ve thuong va so du—————————————————

  234. void

    big_int

    ::

    chia

    (

    big_int b,big_int c,big_int

    &

    d

    )

  235.  

    {

  236.    

    int

    d1

    =

    b.

    dau

    ,d2

    =

    c.

    dau

    ;

  237.     b.

    dau

    =

    0

    ;

    c.

    dau

    =

    0

    ;

  238.    

    if

    (

    d1

    ==

    d2

    )

    dau

    =

    0

    ;

    else

    dau

    =

    1

    ;

  239.    

    if

    (

    !

    b.

    sosanh

    (

    c

    )

    )

  240.      

    {

  241.         a

    [

    0

    ]

    =

    1

    ;

  242.         n

    =

    1

    ;

  243.      

    }

  244.    

    else

  245.    

    {

  246.      

    if

    (

    b.

    sosanh

    (

    c

    )

    ==

    1

    )

  247.            

    {

    d

    =

    b

    ;

    n

    =

    1

    ;

    dau

    =

    0

    ;

    }

  248.      

    else

  249.      

    {

  250.         big_int e

    ;

  251.        

    int

    i

    =

    b.

    n

    1

    ;

  252.        

    for

    (

    i

    =

    b.

    n

    1

    ;

    i

    >=

    0

    ;

    i

    )

  253.          

    {

  254.           a

    [

    i

    ]

    =

    0

    ;

  255.           e.

    dich

    (

    1

    )

    ;

  256.           e.

    a

    [

    0

    ]

    =

    b.

    a

    [

    i

    ]

    ;

  257.           e.

    xoa0

    (

    )

    ;

  258.          

    if

    (

    e.

    sosanh

    (

    c

    )

    !

    =

    1

    )

  259.          

    {

  260.          

    while

    (

    e.

    sosanh

    (

    c

    )

    !

    =

    1

    )

  261.            

    {

  262.             e

    =

    e

    c

    ;

  263.             e.

    xoa0

    (

    )

    ;

  264.             a

    [

    i

    ]

    ++

    ;

  265.            

    }

  266.          

    }

  267.  

  268.          

    }

  269.         n

    =

    b.

    n

    ;

  270.        

    (

    *

    this

    )

    .

    xoa0

    (

    )

    ;

  271.         b.

    dau

    =

    d1

    ;

    c.

    dau

    =

    d2

    ;

  272.         d

    =

    e

    ;

  273.      

    }

  274.    

    }

  275.  

    }

  276. //tao menu va nhap chon muc—————————————————–

  277. int

    chonmenu

    (

    )

  278.  

    {

  279.    

    int

    a

    ;

  280. cout

    <<

    endl

    <<

    “1.phep cong”

    ;

    endl

  281. cout

    <<

    endl

    <<

    “2.phep tru”

    ;

    endl

  282. cout

    <<

    endl

    <<

    “3.phep nhan “

    ;

    endl

  283. cout

    <<

    endl

    <<

    “4.phep chia”

    ;

    endl

  284. cout

    <<

    endl

    <<

    “5.thoat”

    ;

    endl

  285. cout

    <<

    endl

    <<

    “Moi ban chon “

    ;

    endl

  286. cin

    >>

    a

    ;

  287.    

    return

    a

    ;

  288.  

    }

  289. //ham nhap 2 so lon—————————————————————

  290. void

    nhap

    (

    big_int

    &

    x, big_int

    &

    y

    )

  291.  

    {

  292.     clrscr

    (

    )

    ;

  293. cin

    .

    ignore

    (

    1

    )

    ;

  294.    

    int

    k

    ;

  295.     k

    =

    x.

    nhap

    (

    )

    ;

  296.    

    if

    (

    !

    k

    )

  297.      

    {

  298. cout

    <<

    endl

    <<

    “loi nhap “

    ;

    endl

  299.         getch

    (

    )

    ;

  300.        

    exit

    (

    0

    )

    ;

  301.      

    }

  302. cout

    <<

    endl

    ;

    x.

    xoa0

    (

    )

    ;

    endlx.

  303. in

    (

    )

    ;

    cout

    <<

    endl

    ;

    x.endl

  304. cin

    .

    ignore

    (

    1

    )

    ;

  305.     k

    =

    y.

    nhap

    (

    )

    ;

  306.      

    if

    (

    !

    k

    )

  307.      

    {

  308. cout

    <<

    endl

    <<

    “loi nhap “

    ;

    endl

  309.         getch

    (

    )

    ;

  310.        

    exit

    (

    0

    )

    ;

  311.      

    }

  312. cout

    <<

    endl

    ;

    endl

  313.     y.

    in

    (

    )

    ;

  314.  

    }

  315. //thuc hien phep chia————————————————————–

  316. void

    phepchia

    (

    )

  317.  

    {

  318.     big_int x,y,z,d

    ;

  319.     nhap

    (

    x,y

    )

    ;

  320. cout

    <<

    \n

    phep chia “

    ;

  321.     z.

    chia

    (

    x,y,d

    )

    ;

  322. cout

    <<

    endl

    <<

    “thuong “

    ;

    z.

    in

    (

    )

    ;

    endlz.

  323. cout

    <<

    endl

    <<

    “du     “

    ;

    d.

    in

    (

    )

    ;

    endld.

  324.  

    }

  325. //ham mo phong phep nhan——————————————————–

  326. void

    phepnhan

    (

    )

  327.  

    {

  328.     big_int x,y,z

    ;

  329.     nhap

    (

    x,y

    )

    ;

  330. cout

    <<

    endl

    <<

    “phep nhan “

    ;

    endl

  331.     z

    =

    x

    *

    y

    ;

  332. cout

    <<

    endl

    <<

    “tich “

    ;

    z.

    in

    (

    )

    ;

    endlz.

  333.  

    }

  334. //ham phep cong——————————————————————-

  335. void

    phepcong

    (

    )

  336.  

    {

  337.     big_int x,y,z

    ;

  338.     nhap

    (

    x,y

    )

    ;

  339. cout

    <<

    endl

    <<

    “phep cong “

    ;

    endl

  340.     z

    =

    x

    +

    y

    ;

  341. cout

    <<

    endl

    <<

    “tong “

    ;

    z.

    in

    (

    )

    ;

    endlz.

  342.  

    }

  343. //ham phep tru————————————————————————-

  344. void

    pheptru

    (

    )

  345.  

    {

  346.     big_int x,y,z

    ;

  347.     nhap

    (

    x,y

    )

    ;

  348. cout

    <<

    endl

    <<

    “phep tru “

    ;

    endl

  349.     z

    =

    x

    y

    ;

  350. cout

    <<

    endl

    <<

    “hieu “

    ;

    z.

    in

    (

    )

    ;

    endlz.

  351.  

    }

  352. //xay dung muc chon————————————————————

  353. void

    giaodien

    (

    int

    b

    )

  354.  

    {

  355.    

    switch

    (

    b

    )

  356.      

    {

  357.        

    case

    1

    :

  358.          phepcong

    (

    )

    ;

  359.          

    break

    ;

  360.        

    case

    2

    :

  361.          pheptru

    (

    )

    ;

  362.          

    break

    ;

  363.        

    case

    3

    :

  364.          phepnhan

    (

    )

    ;

  365.          

    break

    ;

  366.        

    case

    4

    :

  367.          phepchia

    (

    )

    ;

  368.          

    break

    ;

  369.        

    case

    5

    :

  370.          

    exit

    (

    0

    )

    ;

  371.        

    default

    :

  372. cout

    <<

    endl

    <<

    “muc chon khong ton tai”

    ;

    endl

  373.          

    break

    ;

  374.      

    }

  375.  

    }

  376. //ham main—————————————————————————

  377. void

    main

    (

    )

  378.  

    {

  379.    

    int

    chon

    ;

  380.    

    while

    (

    1

    )

  381.      

    {

  382.         clrscr

    (

    )

    ;

  383.         chon

    =

    chonmenu

    (

    )

    ;

  384.         giaodien

    (

    chon

    )

    ;

  385.         getch

    (

    )

    ;

  386.      

    }

  387.  

    }