fork download
  1. program enigmath; (*Essendo E=N+S(N)+S(S(N))...il problema chiede di trovare N=E-[S(N)+S(S(N))...]*)
  2. (*Si noti che la somma massima delle cifre per un numero inferiore a 10^9 è 9x9=81.*)
  3. (*La "somma delle somme" massima è però 79 + 16 + 7 = 102 ottenuta da numeri tipo 799999999, e le decodificazioni di E sono superiori a E-102.*)
  4. Uses Math;
  5. const MAXX=102;
  6. var
  7. Emin, Emax, i, S, K, inizio, val, count : longint;
  8. cod, dec :array[0..1000000] of longint; (*in cod[i] metto la codifica del numero e in dec[i], inizializzato a zero, sommo +1 tutte le volte che trovo*) (*un numero N di cui è la codifica*)
  9.  
  10. function codifica (x:Longint):Longint;
  11. begin
  12. if x < 10 then codifica:=x (* single digit*)
  13. else
  14. begin
  15. S := 0; K:= x;
  16. while K>0 do
  17. begin
  18. S:=S + K mod 10; (*sum of digits*)
  19. K:=K div 10;
  20. end;
  21. codifica:=x + codifica(S);
  22. end;
  23. end;
  24.  
  25. begin
  26.  
  27.  
  28. readln(Emin,Emax);
  29. if Emin<=102 then inizio:=0 (*Quindi, se Emin>=102 parto da Emin-102 , altrimenti parto da zero e salvo la loro codifica*)
  30. else inizio:=Emin-102;
  31. count:=Emax-Emin+1; (*numero di termini da considerare*)
  32. for i:=inizio to count do dec[i]:=0;
  33. for i := inizio to Emax do
  34. begin
  35. val := codifica(i);
  36. if (Emin <= val) and (val <= Emax) then
  37. begin
  38. cod[val-Emin]:=i;
  39. dec[val-Emin]:=dec[val-Emin]+1;
  40. end;
  41. end;
  42. for i := 0 to count-1 do
  43. begin
  44. if dec[i]= 0 then writeln('IMPOSSIBLE') (*no decodings exist for E*)
  45. else if dec[i]>1 then writeln('AMBIGUOUS') (*multiple possible decodings exist for E*)
  46. else writeln(cod[i]); (*unique decoding of E*)
  47. end;
  48. end.
Success #stdin #stdout 0s 5320KB
stdin
42 42
stdout
29