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