Løsningsforslag - oppgaver i Avsnitt 1.7.18


Oppgave 1

  long a = 9223372036854775807L;
  long b = 6148914691236517205L;

  System.out.println(a + b);

  // Utskrift: -3074457345618258604

Oppgave 2

  public static String add(String a, String b)
  {
    for (int k = a.length() - 1; k >= 0; k--)
    {
      int siffer = a.charAt(k);
      if (siffer < 48 || siffer > 57)
        throw new NumberFormatException(a);
    }

    for (int k = b.length() - 1; k >= 0; k--)
    {
      int siffer = b.charAt(k);
      if (siffer < 48 || siffer > 57)
        throw new NumberFormatException(b);
    }

    if (b.length() < a.length())
    {
      String c = b; b = a; a = c;
    }

    // a <= b

    StringBuilder sum = new StringBuilder();

    int mente = 0;
    int i = a.length() - 1, j = b.length() - 1;
    for (; i >= 0; i--,j--)
    {
      int s = a.charAt(i) + b.charAt(j) - 96 + mente;
      sum.append(s < 10 ? s : s - 10);
      mente = s < 10 ? 0 : 1;
    }

    // tar med det som står igjen i b
    for (; j >= 0; j--)
    {
      int s = b.charAt(j) - 48 + mente;
      sum.append(s < 10 ? s : s - 10);
      mente = s < 10 ? 0 : 1;
    }

    if (mente > 0) sum.append(1);

    return sum.reverse().toString();
  }

Oppgave 3

Det er like mange 0-er bakerst i et tall som antallet ganger 10 går opp i tallet. Men 10 = 2 · 5. Derfor holder det her å finne hvor mange ganger 5 går opp siden det er nok 2-ere å ta av. Vi har at 5 går opp i hvert femte tall, dvs. i 5, 10, 15, . . , 95 og 100. Det blir 20 ganger. Men 5 går opp ytterligere en gang i tallene 25, 50, 75 og 100. Tilsammen 24 ganger. Med andre ord er det 24 0-er bakerst i 100!. Stemmer det med utskriften i Programkode 1.7.18 c)?

Oppgave 4

  public static int[] add(int[] a, int[] b)
  {
    if (b.length < a.length) // bytter hvis b er kortest
    {
      int[] tmp = b; b = a; a = tmp;
    }
    // Nå vet vi at a er kortest (eller like lang som b)

    // resultatet (summen) er minst så lang som den lengste
    int c[] = new int[b.length];
    long sum = 0, mente = 0;
    long m = 0xffffffffL;  // maskerer vekk de 32 første sifrene

    int j = b.length - 1;
    for (int i = a.length - 1; i >= 0; i--,j--)
    {
      sum = (a[i] & m) + (b[j] & m) + mente;
      mente = sum >>> 32;
      c[j] = (int)(sum & m);
    }

    for (; j >= 0; j--)
    {
      sum = (b[j] & m) + mente;
      mente = sum >> 32;
      c[j] = (int)(sum & m);
    }

    // Hvis mente > 0, må vi utvide c

    if (mente > 0) // mente er lik 1
    {
      int[] d = c;
      c = new int[b.length + 1];
      System.arraycopy(d,0,c,1,d.length);
      c[0] = 1;
    }
    return c;
  }

Oppgave 5