INFOPedia : PRGNumeri

HomePage :: Categorie :: Indice :: Ultime modifiche :: Ultimi commenti :: Login/Registrazione

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

Soluzione 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;

{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;
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;

{Anche questa è ridondante, identica a get_v. Utile per aumentare la leggibilità. }
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('Il file input.txt non esiste');
          readln;
          end;
    close(fin);
    close(fout);

end.

--
Torna all'indice

Non ci sono commenti in questa pagina. [Scrivi commento]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.1
La pagina è stata generata in 0.1390 secondi