Vi propongo un esercizio molto interessante che ho trovato su topcoder.
L'esercizio richiede che venga svolto in uno dei seguenti linguaggi:
VB - C# - C++ -Java
E tramite l'utilizzo delle classi.
Il testo è il seguente:
Riporto la mia soluzione:
Main.cpp (per controllare la correttezza della classe):
SquareDigits.h:
L'esercizio richiede che venga svolto in uno dei seguenti linguaggi:
VB - C# - C++ -Java
E tramite l'utilizzo delle classi.
Il testo è il seguente:
Codice:
***Nota: Mantieni il programma al di sotto dei 7000 caratteri!
Nome Classe: SquareDigits
Nome Metodo: smallestResult
Parametri: int
Restituisce: int
Definisci la funzione S(x) come la somma dei quadrati delle cifre di x.
Per esempio: S(3)=3*3=9 and S(230)=2*2+3*3+0*0=13.
Definisci il set T(x) che deve essere l'insieme dei numeri UNICI che sono prodotti applicando ripetutamente S a x. Che vuol dire: S(x), S(S(x)), S(S(S(x))), etc...
Per esempio, applicando ripetutamente S a 37:
S(37)=3*3+7*7=58.
S(58)=5*5+8*8=89.
S(89)=145.
S(145)=42.
S(42)=20.
S(20)=4.
S(4)=16.
S(16)=37.
Nota che la sequenza si ripeteràquindi possiamo fermarci a calcolare e:
T(37)={58,89,145,42,20,4,16,37}.
Comunque, nota che T(x) non deve contenere necessariamente x.
Implementa una classe SquareDigits, che contiene un metodo smallestResult.
Il metodo riceve un intero, n, come parametro e restituisce il più piccolo intero, x, tale che T(x) contenga n.
La definizione del metodo è la seguente (Assicurati che il tuo metodo sia pubblico):
int smallestResult(int n);
n deve essere non negativo e compreso tra 0 e 199 inclusi.
Esempi:
Se n=0: S(0) = 0, quindi T(0)={0}, e il metodo dovràrestituire 0.
Se n=2: da T(0) fino a T(10) non contengono il valore 2. Se x=11, comunque:
S(11)=1*1+1*1=2, quindi T(11) contiene 2, e il metodo restituire 11.
Se n=10: da T(0) fino a T(6) non contengono 10. Se x=7:
S(7)=49.
S(49)=97.
S(97)=130.
S(130)=10.
S(10)=1.
E inizia a ripetersi
quindi T(7) è {49,97,130,10,1}, che contiene 10, e il metodo ritornerà7.
Quindi passando al metodo i seguenti numeri n si otterranno i risultati:
n=1 -> x=1
n=19 -> x=133
n=85 -> x=5
n=112 -> x=2666
Riporto la mia soluzione:
Main.cpp (per controllare la correttezza della classe):
Codice:
#include <iostream>
#include "SquareDigits.h"
using namespace std;
int main()
{
int ins=0;
SquareDigits calc;
while (ins!=-1){
cout << "Inserisci il numero di cui calcolare lo SquareDigits\n";
cin >> ins;
cout <<endl;
int n = (ins>-1)?calc.smallestResult(ins):-1;
if (n!=-1) cout << "il risultato e' "<< n << endl;
}
cout << "Arrivederci!\n";
return EXIT_SUCCESS;
}
SquareDigits.h:
Codice:
#include <stdlib.h>
#ifndef SQUAREDIGITS_H_INCLUDED
#define SQUAREDIGITS_H_INCLUDED
class SquareDigits {
public:
int smallestResult(int _numb);
private:
int count;
int S(int n);
int* T(int x);
protected:
bool isIn(int search, int* vet, int dim);
};
#endif // SQUAREDIGITS_H_INCLUDED
int SquareDigits::smallestResult(int _numb){
int x;
for (x=0;!(isIn(_numb,T(x),count));x++);
return x;
}
int SquareDigits::S(int n){
int digit=1,temp=0,dec = 10;
while (digit!=0){
digit = n % dec;
n/=dec;
temp += digit*digit;
}
return temp;
}
int* SquareDigits::T(int x){
count = 0;
int *temp = (int*) malloc((count+1)*sizeof(int));
bool exist=false;
temp[count] = S(x);
exist = isIn(x,temp,count);
while(!exist){
count++;
temp = (int*) realloc(temp,(count+1)*sizeof(int));
temp[count] = S(temp[count-1]);
exist = isIn(temp[count],temp,count);
}
return temp;
}
bool SquareDigits::isIn(int search, int* vet, int dim){
for (int i=0;i<dim;i++)
if (vet[i]==search) return true;
return false;
}