La versione più recente è stata modificata il 2007-04-25 04:06:33 da TheKaneB
Aggiunzioni:
Soluzione proposta da: TheKaneB
Omissioni:
Soluzion proposta da: TheKaneB
Modificato il 2007-04-25 04:05:10 da TheKaneB [Aggiunti commenti al codice]
Aggiunzioni:
{get_x è quasi identica a get_i, quindi è ridondante. L'ho mantenuta per
chiarezza del codice, ma può essere eliminata con alcuni accorgimenti.}
function get_x(u,d : integer): integer;
{Anche questa è ridondante, identica a get_v. Utile per aumentare la leggibilità. }
writeln('Il file input.txt non esiste');
Omissioni:
function get_x(u,d : integer): integer;
writeln('Errore nel file input.txt');
La versione più vecchia di questa pagina è stata modificata il 2007-04-24 23:36:46 da DenteDiLupo []
Vista della pagina:
Numeri romani
Descrizione del Problema
Molte persone hanno familiaritµa con la numerazione romana per numeri rel-
ativamente piccoli. I simboli i, v, x, l, c rappresentano i valori decimali
1; 5; 10; 50; 100, rispettivamente. Per rappresentare gli altri valori vengono
concatenati questi simboli ed eventuali loro copie, in modo tale che i sim-
boli con un valore minore si trovino piµu a destra. Per esempio, il numero
3 µe rappresentato con iii, e il valore 73 µe rappresentato con lxxiii. Le
eccezioni a tale regola si veriŻcano per numeri aventi unitµa 4 o 9, e per i dieci
valori a partire da 40 e a partire da 90. Per questi casi infatti, le rappresen-
tazioni numeriche romane sono iv (4), ix (9), xl (40), xc (90). Cosµ³ le rap-
presentazioni per 24; 39; 44; 49; 94 sono xxiv, xxxix, xliv, xlix, xciv,
rispettivamente.
La prefazione di molti libri ha le pagine numerate con i numeri romani, che
cominciano da i per la prima pagina e proseguono in sequenza. Assumiamo
di considerare libri aventi al piµu 100 pagine di prefazione. Il tipografo ha
bisogno di sapere quanti caratteri i, v, x, l, c servono per numerare le
pagine della prefazione di un dato libro. Per esempio, in una prefazione di 5
pagine sono usati i numeri romani i, ii, iii, iv, v, ovvero 7 caratteri i
e 2 caratteri v.
Dati di input
Il file input.txt contiene sequenza di N +1 interi in un range da 1 a 100. La
prima riga contiene il valore N che rappresenta il numero dei libri da esam-
inare. Le successive N righe indicano il numero delle pagine della prefazione
di ciascun libro.
Dati in output
Il file output.txt contiene N righe, una per ciascun libro. Ogni riga contiene
il numero di pagine del libro corrispondente seguite dal numero di carat-
teri per ogni tipo che servono per numerare le pagine. L'esempio mostra il
formato con cui l'output deve essere restituito.
Esempio di input
4
1
2
20
99
Esempio di output
1: 1 i, 0 v, 0 x, 0 l, 0 c
2: 3 i, 0 v, 0 x, 0 l, 0 c
20: 28 i, 10 v, 14 x, 0 l, 0 c
99: 140 i, 50 v, 150 x, 50 l, 10 c
Soluzion proposta da: TheKaneB
program numromani;
uses SysUtils;
var N, books: integer;
somma_i, somma_v, somma_x, somma_l, somma_c: integer;
i, u, d, c: integer;
idx: integer;
fin, fout: textfile;
function get_i(u: integer): integer;
begin
case u of
1,4,6,9: get_i := 1;
2,7: get_i := 2;
3,8: get_i := 3;
else get_i := 0;
end;
end;
function get_v(u: integer): integer;
begin
case u of
4,5,6,7,8: get_v:=1;
else get_v := 0;
end;
end;
function get_x(u,d : integer): integer;
begin
case d of
1,4,6,9: get_x := 1;
2,7: get_x := 2;
3,8: get_x := 3;
else get_x := 0;
end;
if u = 9 then get_x := get_x + 1;
end;
function get_l(d: integer): integer;
begin
case d of
4,5,6,7,8: get_l := 1;
else get_l := 0;
end;
end;
function get_c(d: integer): integer;
begin
if d = 9 then get_c := 1
else get_c := 0;
end;
function GetInput: boolean;
begin
if fileexists('input.txt') then begin
assignfile(fin, 'input.txt');
reset(fin);
GetInput := TRUE;
end
else GetInput := FALSE;
end;
begin
if GetInput then begin
readln(fin, books);
assignfile(fout, 'output.txt');
rewrite(fout);
for idx:=1 to books do begin
readln(fin, N);
somma_i := 0;
somma_v := 0;
somma_x := 0;
somma_l := 0;
somma_c := 0;
for i:=1 to N do begin
u:= i mod 10;
d:= ((i - u) mod 100) div 10;
c:= i div 100;
somma_i := somma_i + get_i(u);
somma_v := somma_v + get_v(u);
somma_x := somma_x + get_x(u, d);
somma_l := somma_l + get_l(d);
somma_c := somma_c + get_c(d) + c;
end;
writeln(fout, N,': ',somma_i,' i, ',somma_v,' v, ',somma_x,' x, ',somma_l,' l, ', somma_c,' c');
end; {for...}
end
else begin
writeln('Errore nel file input.txt');
readln;
end;
close(fin);
close(fout);
end.
--
Torna all'indice