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