5.1 · exercise

Base eight, by hand

Print a number in octal (base 8) without letting printf do the conversion: no %o or %lo anywhere in the program.

Write n as a sum of powers of 8 and the digits fall out: 493 is 7 * 64 + 5 * 8 + 5 * 1, so in octal it is 755. Start at the largest power of 8 that fits in n. Divide n by it: the quotient is the next digit, and the remainder carries on to the next power down. Stop after the power 1.

The starter reads n and prints the start of the line (493 in octal is ). You print the digits, one printf with fmt_digit each, and the starter ends the line. Print no leading zeros, but 0 itself prints as 0.

A negative n prints the way %lo would print it: the octal digits of the 64 bits the machine actually stores for it (its two's complement pattern), so -1 comes out as 1777777777777777777777. That means treating n's bits as unsigned throughout: udiv rather than sdiv, and when you compare two such values, the unsigned conditions b.lo, b.ls, b.hi and b.hs, not their signed partners.

Hint: to find the starting power, compare it with n / 8 rather than comparing power * 8 with n. Near the top of the 64-bit range, power * 8 no longer fits.

What is checked

  • with the input 493 the program prints 493 in octal is 755 and returns 0
  • no %o-style format string appears in the program
  • the checker also tries values you do not see: 0, exact powers of 8, the largest 64-bit number, and negatives

specification

stdin493
stdoutprints the right output
exitexits with the right code
sourcedoes not contain %o
sourcedoes not contain %lo
sourcedoes not contain %llo
hiddenright output and exit code on 7 more inputs you do not see

We run your program on the input above and on the hidden ones, and compare what it does. Nothing is matched against a stored solution.

loading editor...

regfile

N clearZ clearC clearV clear

x0–x30 are the integer registers.

X0arg00x0000000000000000
X1arg10x0000000000000000
X2arg20x0000000000000000
X3arg30x0000000000000000
X4arg40x0000000000000000
X5arg50x0000000000000000
X6arg60x0000000000000000
X7arg70x0000000000000000
X8ind0x0000000000000000
X90x0000000000000000
X100x0000000000000000
X110x0000000000000000
X120x0000000000000000
X130x0000000000000000
X140x0000000000000000
X150x0000000000000000
X16ip00x0000000000000000
X17ip10x0000000000000000
X18pr0x0000000000000000
X190x0000000000000000
X200x0000000000000000
X210x0000000000000000
X220x0000000000000000
X230x0000000000000000
X240x0000000000000000
X250x0000000000000000
X260x0000000000000000
X270x0000000000000000
X280x0000000000000000
X29fp0x0000000000000000
X30lr0x0000000000000000
SP0x0000000080000000
PC0x0000000000400000
console

Output prints here as your program runs.

Press step or run under the editor, or feed stdin from the box below.

not assembled

Open in playground