esercizi sulle classi

Stato
Discussione chiusa ad ulteriori risposte.

solo

Utente Silver
29 Maggio 2008
40
1
0
63
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:
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;
}
 
Bello.
In C++.
Header della classe
Codice:
#ifndef SQUAREDIGITS_H_INCLUDED
#define SQUAREDIGITS_H_INCLUDED

#include <vector>
#include <cstdlib>

class SquareDigits {
    private:
        std::vector<int> v;
        int S(int x);
        void T(int x);
        bool isInVector(int number);
        bool Repeat();
    public:
        int smallestResult(int number);
        SquareDigits();
};

#endif // SQUAREDIGITS_H_INCLUDED
Implementazione classe
Codice:
#include "SquareDigits.h"

SquareDigits::SquareDigits() {}

int SquareDigits::S(int x) {
    int result=0;
    char buffer [30];
    itoa (x,buffer,10);
    for(int i=0;buffer[i]!='\0';i++)
        result+=((int)buffer[i]-48)*((int)buffer[i]-48);
    return result;
}

void SquareDigits::T(int x) {
    int value=x;
    v.clear();
    do {
        value=S(value);
        v.push_back(value);
    }while(!Repeat());
}

bool SquareDigits::Repeat() {
    for(unsigned int i=0;i<v.size();i++) {
        for(unsigned int j=0;j<v.size();j++)
            if(i!=j)
                if(v[i]==v[j]) return true;
    }
    return false;
}

bool SquareDigits::isInVector(int number) {
    for(unsigned int i=0;i<v.size();i++)
        if(v[i]==number) return true;
    return false;
}

int SquareDigits::smallestResult(int number) {
    int i=0;
    for(i=0;;i++) {
        T(i);
        if(isInVector(number)) break;
    }
    return i;
}
Main
Codice:
#include <iostream>
#include "SquareDigits.h"

using namespace std;

int main()
{
    SquareDigits *s = new SquareDigits();
    cout<<"1: "<<s->smallestResult(1)<<endl;
    cout<<"19: "<<s->smallestResult(19)<<endl;
    cout<<"85: "<<s->smallestResult(85)<<endl;
    cout<<"112: "<<s->smallestResult(112)<<endl;
    return 0;
}
Out
Codice:
1: 1
19: 133
85: 5
112: 2666
Caratteri del programma (compreso il main e caratteri di tabulazione) 1716.
 
solo ha detto:
[ot]finalmente qualcuno che risponde, complimenti ;)[/ot]

[ot]
E di che.. anzi.. l'ho fatto in pochi minuti volendo si potrebbe migliorare una cosetta..

Comunque se ne hai altri postali pure :)
[/ot]
 
magari sabato che mi libero un po' dell'università o se riesco in nottata domani o venerdì :)
 
Stato
Discussione chiusa ad ulteriori risposte.