23 marzo 2011 - 12:45

E l'ultimo quesito della settimana riguarda un

Numero autoreferenziale

Devi trovare un numero intero di 10 cifre, ABCDEFGHIJ tale che:

- A esprima quanti 0 stanno nella rappresentazione decimale del numero

- B esprima quanti 1 stanno nella rappresentazione decimale del numero

- C esprima quanti 2 stanno nella rappresentazione decimale del numero

e così via fino a

- J esprima quanti 9 stanno nella rappresentazione decimale del numero

 Esempio :

12220 è costituito da uno 0, tre 2, zero 3, zero 4, ma non è un numero autoreferenziale né di 10 cifre. Sai trovare il numero tu?

Buon divertimento.

Buongiorno Prof,

sono Benedetta di 3H (con l'account di mio fartello perchè non riesco a creare il mio).

Ho provato a rispondere:

6210001000

Arrivederci Benedetta

6210001000 perchè ha sei "0", due "1", un "2", zero "3", né "4" né "5", un "6", nessun "7", "8" o "9". Penso sia così. E se è cosi non voglio più essere chiamato fuori alla lavagna indegnamente fino alla fine di questo anno. Saluti Walter

 

 

Anche io ho trovato che il numero è 6210001000...posto anche un algoritmo in pascal che analizza tutti i numeri di 10 cifre per controllare se sono autoreferenziali o no.

Eccolo:

uses crt;

 

var

   NN: Real;

   NS: String;

   Vett: array[0..9] of Real;

   Error: Integer;

 

function PrendiPrimaLettera(S: String): String; {Prende la prima cifra del numero convertito in stringa}

var

  I,C: Integer;

begin

  I:=Length(S);

  C:=I-1;

  Delete(S,2,C);

  PrendiPrimaLettera:=S;

end;

 

procedure ComponiVettore; {Crea il vettore di 10 elementi che conterrà le 10 cifre del numero}

var

  B: Integer;

begin

  Str(NN:10:0,NS);

  for B:=0 to 9 do

  begin

   Val(PrendiPrimaLettera(NS),Vett[B],Error);

   Delete(NS,1,1);

  end;

end;

 

procedure ScomponiVettore; {Dal vettore che contiene le cifre del numero trova il numero in formato stringa}

var

  B: Integer;

  A: String;

begin

  NS:='';

  A:='';

  for B:=0 to 9 do

  begin

    Str(Vett[B],A);

    NS:=NS+A;

  end;

end;

 

function ControllaAutoRef(N: Comp): Boolean; {Controlla se il numero è autoreferente, rispondendo True o False}

var I,Y,O: Integer;    Vett2: Array[0..9] of Integer;

begin

  ComponiVettore;

  for I:=0 to 9 do

    Vett2[I]:=0;

  for I:=0 to 9 do

  begin

          if Vett[I]=0 then Vett2[0]:=Vett2[0]+1;

          if Vett[I]=1 then Vett2[1]:=Vett2[1]+1;

          if Vett[I]=2 then Vett2[2]:=Vett2[2]+1;

          if Vett[I]=3 then Vett2[3]:=Vett2[3]+1;

          if Vett[I]=4 then Vett2[4]:=Vett2[4]+1;

          if Vett[I]=5 then Vett2[5]:=Vett2[5]+1;

          if Vett[I]=6 then Vett2[6]:=Vett2[6]+1;

          if Vett[I]=7 then Vett2[7]:=Vett2[7]+1;

          if Vett[I]=8 then Vett2[8]:=Vett2[8]+1;

          if Vett[I]=9 then Vett2[9]:=Vett2[9]+1;

  end;

  Y:=0;

  for I:=0 to 9 do

    if Vett[I]=Vett2[I] then  Y:=Y+1;

  if Y=10 then ControllaAutoRef:= True else ControllaAutoRef:=False;

end;

 

function BooleanToStr(V: Boolean): String; {Converte il risultato da Boolean a una stringa}

begin

  if V = True then BooleanToStr:='True' else BooleanToStr:='False';

end;

 

 

var

  A: LongInt;

  F: Text;

  W: String;

 

{Inizia l'algoritmo principale; Crea il file C:\num.txt, dove inserisce ogni numero che analizza e accanto

il risultato della funzione ControllaAutoRef. Controlla tutti i numeri di 10 cifre}

 

begin

  Assign(F, 'C:\num.txt');

  ReWrite(F);

  WriteLn(F,' ');

  NN:=1000000000.0;

  for A:=0 to 899999999 do

  begin

    Str(NN:10:0,NS);

    ComponiVettore;

    WriteLn(NN:10:0);

    begin

    Str(NN,NS);

    ControllaAutoRef(NN);

    Str(NN:10:0,W);

    WriteLn(F,W+ ' ' + BooleanToStr(ControllaAutoRef(NN)));

    NN:=NN+1;

    end;

    end;

 

end.

Ho provato a compilarlo con Free Pascal e Turbo Pascal 7...con alcuni compilatori potrebbe dare problemi (e fermarsi al numero 3147483647 durante l'esecuzione del programma) per un problema di definizione del tipo numerico LongInt che per qualche compilatore è definito solo nell'intervallo [-2147483648;+2147483647]

 

Arrivederci, Alessio Marta