ACM ICPC Praktikum - PowerPoint PPT Presentation

About This Presentation
Title:

ACM ICPC Praktikum

Description:

ACM ICPC Praktikum Kapitel 5: Arithmetik und Algebra bersicht Libraries Exakte Arithmetik Wichtige Basen Wichtige Mengen Reelle Zahlen Algebra Integer Libraries C ... – PowerPoint PPT presentation

Number of Views:96
Avg rating:3.0/5.0
Slides: 22
Provided by: ChristianS77
Category:
Tags: acm | icpc | praktikum

less

Transcript and Presenter's Notes

Title: ACM ICPC Praktikum


1
ACM ICPC Praktikum
  • Kapitel 5 Arithmetik und Algebra

2
Übersicht
  • Libraries
  • Exakte Arithmetik
  • Wichtige Basen
  • Wichtige Mengen
  • Reelle Zahlen
  • Algebra

3
Integer Libraries
  • C/Cstdlib.h, math.h
  • GNU g Integer class
  • Java.math BigInteger
  • .

4
Exakte Arithmetik
  1. include ltstdio.hgt
  2. define MAXDIGITS 100 / maximum length bignum
    /
  3. define PLUS 1 / positive sign bit /
  4. define MINUS -1 / negative sign bit /
  5. typedef struct
  6. char digitsMAXDIGITS /
    represent the number /
  7. int signbit / 1 if positive, -1 if negative
    /
  8. int lastdigit / index of high-order
    digit /
  9. bignum
  10. print_bignum(bignum n)
  11. int i
  12. if (n-gtsignbit MINUS) printf("- ")

5
Exakte Arithmetik
  • int_to_bignum(int s, bignum n)
  • int i / counter /
  • int t / int to work with /
  • if (s gt 0) n-gtsignbit PLUS
  • else n-gtsignbit MINUS
  • for (i0 iltMAXDIGITS i) n-gtdigitsi
    (char) 0
  • n-gtlastdigit -1
  • t abs(s)
  • while (t gt 0)
  • n-gtlastdigit
  • n-gtdigits n-gtlastdigit (t 10)
  • t t / 10

6
Exakte Arithmetik
  • initialize_bignum(bignum n)
  • int_to_bignum(0,n)
  • int max(int a, int b)
  • if (a gt b) return(a) else return(b)

7
Exakte Arithmetik
  • add_bignum(bignum a, bignum b, bignum c)
  • int carry / carry digit /
  • int i / counter /
  • initialize_bignum(c)
  • if (a-gtsignbit b-gtsignbit) c-gtsignbit
    a-gtsignbit
  • else
  • if (a-gtsignbit MINUS)
  • a-gtsignbit PLUS
  • subtract_bignum(b,a,c)
  • a-gtsignbit MINUS
  • else
  • b-gtsignbit PLUS
  • subtract_bignum(a,b,c)
  • b-gtsignbit MINUS
  • return

8
Exakte Arithmetik
  1. subtract_bignum(bignum a, bignum b, bignum c)
  2. int borrow / has anything been borrowed? /
  3. int v / placeholder digit /
  4. int i / counter /
  5. if ((a-gtsignbit MINUS) (b-gtsignbit
    MINUS))
  6. b-gtsignbit -1 b-gtsignbit
  7. add_bignum(a,b,c)
  8. b-gtsignbit -1 b-gtsignbit
  9. return
  10. if (compare_bignum(a,b) PLUS)
  11. subtract_bignum(b,a,c)
  12. c-gtsignbit MINUS
  13. return

9
Exakte Arithmetik
  1. compare_bignum(bignum a, bignum b)
  2. int i / counter /
  3. if ((a-gtsignbit MINUS) (b-gtsignbit
    PLUS)) return(PLUS)
  4. if ((a-gtsignbit PLUS) (b-gtsignbit
    MINUS)) return(MINUS)
  5. if (b-gtlastdigit gt a-gtlastdigit) return (PLUS
    a-gtsignbit)
  6. if (a-gtlastdigit gt b-gtlastdigit) return (MINUS
    a-gtsignbit)
  7. for (i a-gtlastdigit igt0 i--)
  8. if (a-gtdigitsi gt b-gtdigitsi) return(MINUS
    a-gtsignbit)
  9. if (b-gtdigitsi gt a-gtdigitsi) return(PLUS
    a-gtsignbit)
  10. return(0)

10
Exakte Arithmetik
  1. zero_justify(bignum n)
  2. while ((n-gtlastdigit gt 0) (n-gtdigits
    n-gtlastdigit 0))
  3. n-gtlastdigit --
  4. if ((n-gtlastdigit 0) (n-gtdigits0
    0))
  5. n-gtsignbit PLUS / hack to avoid -0 /
  6. digit_shift(bignum n, int d) / multiply n by
    10d /
  7. int i / counter /
  8. if ((n-gtlastdigit 0) (n-gtdigits0 0))
    return
  9. for (in-gtlastdigit igt0 i--)
  10. n-gtdigitsid n-gtdigitsi

11
Exakte Arithmetik
  • multiply_bignum(bignum a, bignum b, bignum c)
  • bignum row / represent shifted row /
  • bignum tmp / placeholder bignum /
  • int i,j / counters /
  • initialize_bignum(c)
  • row a
  • for (i0 iltb-gtlastdigit i)
  • for (j1 jltb-gtdigitsi j)
  • add_bignum(c,row,tmp)
  • c tmp
  • digit_shift(row,1)
  • c-gtsignbit a-gtsignbit b-gtsignbit

12
Exakte Arithmetik
  • divide_bignum(bignum a, bignum b, bignum c)
  • bignum row /
    represent shifted row /
  • bignum tmp /
    placeholder bignum /
  • int asign, bsign / temporary signs /
  • int i,j /
    counters /
  • initialize_bignum(c)
  • c-gtsignbit a-gtsignbit b-gtsignbit
  • asign a-gtsignbit
  • bsign b-gtsignbit
  • a-gtsignbit PLUS
  • b-gtsignbit PLUS
  • initialize_bignum(row)
  • initialize_bignum(tmp)

13
Exakte Arithmetik
  1. main()
  2. int a,b
  3. bignum n1,n2,n3,zero
  4. while (scanf("d d\n",a,b) ! EOF)
  5. printf("a d b d\n",a,b)
  6. int_to_bignum(a,n1)
  7. int_to_bignum(b,n2)
  8. add_bignum(n1,n2,n3)
  9. printf("addition -- ")
  10. print_bignum(n3)
  11. printf("compare_bignum a ? b
    d\n",compare_bignum(n1, n2))
  12. subtract_bignum(n1,n2,n3)
  13. printf("subtraction -- ")
  14. print_bignum(n3)

14
Wichtige Basen
  • Binärsystem
  • Zahlen basierend auf 0,1
  • Wird in Computern verwendet
  • x 2 0,1 Bit, y 2 0,18 Byte, z 2 0,116
    Wort
  • Ganze Zahlen in C 8 Bits (char), 16 Bits
    (int), 32 Bits (long), 64 Bits (long long)
  • Umwandlung in Dezimalsystem (z31
    z30 z0)2 (?i0..31 zi 2i)10
  • Beispiel 101110012 18510

15
Wichtige Basen
  • Hexadezimalsystem
  • Zahlen basierend auf 0,,9,A,,F(16 Ziffern)
  • Wurde für kompaktere Binärdarstellungen
    eingeführt (2 Hexzahlen 1 Byte)
  • Umwandlung in Dezimalsystem(z7 z6 z0)2
    (?i0..7 zi16i)10
  • Beispiel AF16 17510

16
Wichtige Mengen
  • IN 1,2,3, Menge der natürlichen Zahlen
  • Z ...,-2,-1,0,1,2,... Menge der ganzen
    Zahlen
  • Q x/y x 2 Z, y 2 IN Menge der rationalen
    Zahlen
  • IR Menge der reellen Zahlen
  • C IR IR Menge der komplexen Zahlen

Z
Z
17
Reelle Zahlen
  • Numerik Lehre der Rundungsfehler
  • Wichtig für reelle Zahlen!!
  • IEEE Standard Ergebnis muss so gerundet werden,
    dass es am nächsten am tatsächlichen Wert ist
    (nichttrivial für Funktionen wie x )
  • Regel vermeide Divisionen soweit es
    geht(Division durch 2-Potenz OK)

18
Algebra
  • Polynome
  • Repräsentation von f(x) an xn an-1
    xn-1 a0 x0als Vektor (an,an-1,,a0)
  • f(x)(an,an-1,,a0), g(x) (bn,bn-1,,b0)-
    f(x)g(x) (anbn,an-1bn-1,,a0b0)- f(x)g(x)
    (c2n,c2n-1,,c0) mit ck
    ?ijk ai bj

19
Algebra
  • Division von Polynomen
  • Kniffelig, da Polynome gemäß Division nicht
    abgeschlossen sind.
  • Wie bei Division von ganzen Zahlen, d.h. für
    beliebiges f(x) und g(x) suchen wir h(x) und r(x)
    mit Grad(r(x))ltGrad(g(x)), so dass
    f(x) h(x) g(x) r(x)
  • Dann ist f(x) div g(x) h(x) und f(x) mod g(x)
    r(x)

20
Algebra
  • Lösungen quadratischer Gleichungen
  • Lösungen von x2pxq 0sind
    x1/2 -(p/2) (p/2)2-q
  • (p/2)2-q lt 0 keine Lösung

21
Algebra
  • Logarithmus
  • f(x) logb x ist die inverse Funktion zu g(x)
    bx, d.h. für das y mit ybx gilt xlogb y.
  • Für beliebige b,b 2 IN gilt logb x
    (logb x)/(logb b)
Write a Comment
User Comments (0)
About PowerShow.com