Newsgroup: it.comp.lang.c++
Titolo: Come fare per ottenere un intero ristretto solo a tot sim..

Salve, ho una serie di problemi per la gestione dei numeri in un programma in C++.
Sto costruendo un programma che per il particolare problema mi impone di utilizzare molti vettori multi-dimensionali abbastanza grandi come indici anche se il campo dei numeri interi memorizzabili e' massimo 90 o 120 numeri, esiste qualche sistema per definire un "int" (chiaramente con diverso nome) che anzicche' arrivare a 65536 numeri arrivi a 90 o 120 numeri in modo da ridurre lo spazio richiesto in memoria ?
Inoltre, sebbene sembra molto vicino al problema precedente ma non lo e', come si puo' cambiare la base decimale 10 a 90 o 120 simboli, ridifinendo un nuovo tipo (es: int2) ?  
(esempio come risultato 1,2,3,4,5.....87,88,89,90,1,2,3,4 ecc. non interessa nessun riporto ma solo che
se si somma al 90 o al 120 una unita' il risultato deve essere 1)
88 + 5 = 3
89 + 5 = 4
90 + 5 = 5
1   + 5 = 6
2   + 5 = 7
ecc.
Saluti a tutti e Vi ringrazio per aver letto questo mio problema. Ringraziamenti maggiori a chi mi risponde a questi miei problemi.
--> Brought to you by World News (Amiga) v0.85 <--

 120 una unita' il risultato deve essere 1)
Non ho capito esattamente cosa intendi per cambiare base decimale.
Per ottenere i risultati degli esempi si puo' definire una classe
e i vari operatori. Esempio:
template <int MAX>
class Int {
  int m_value;
public:
  explicit Int( int value ) : m_value( value ) {}
  int value() const { return m_value; }
  Int & operator += ( Int rhs ) {
    m_value += rhs.m_value;
    if (m_value > MAX) m_value -= MAX;
    return *this;
  }
  Int & operator ++ () {
    ++m_value;
    if (m_value > MAX) m_value -= MAX;
    return *this;
  }
  // operatori -=, --, ...
};
template <int MAX>
Int<MAX> operator + ( Int<MAX> lhs, const Int<MAX> rhs )
{
  return lhs += rhs;
}
template <int MAX>
bool
operator == ( Int<MAX> lhs, Int<MAX> rhs )
{
  return lhs.value() == rhs.value();
}
// operatori -, <, ...
typedef Int<90> Int90;
typedef Int<120> Int120;
//-------------------
	Mauro

Devi usare l'operatore modulo, ossia %
Questo operatore restituisce il resto della divisione di A / B; esempio:
A = 10
B = 3
A / B = 3
A % B = 1
Nel tuo caso, se un numero assume valore 91, facendo il modulo 91 % 90
ottieni 1, e cosi'
via:
92 % 90 = 2
93 % 90 = 3
--
Byez
Stefano Tempesta
temp...@tin.it
http://tempesta.freeweb.org

89 + 5 = 4
    [snip]
Un esempio semplice potrebbe essere:
template <int base, typename store = int>
class modint {
    store val;
public:
    modint(int i=0): val(i%base) {}
    operator int() const { return val; }
};
Il tipo modint<> risulta intercambiabile con qualsiasi
altro tipo aritmetico integrale, ma esegue una operazione
di "resto modulo base" per trasformare altri tipi
aritmetici integrali nel costruttore, cosi` che, se base>0,
e' sempre 0<=val<base.  La possibilita` di stabilire un
tipo di memorizzazione diverso da int puo` consentire
ottimizzazioni di spazio, a seconda del compilatore in
uso; bisognera` controllare, su di un dato compilatore,
se ad esempio un vector< modint<90,signed char> >
occupi in effetti meno memoria di un vector< modint<90> >;
se no, occorrera' specializzare vector<>, lavoro non
esattamente triviale a meno di non ricorrere a trucchi
discutibili come
    template<>
    vector< modint<90> >: public vector<signed char>
    {
        // eventuali costruttori necessari
    };
Alex

 deve essere 1)
Basta utilizzare l'operatore modulo %. Es.: ( 88 + 5 ) % 90 ==> 3. Il
tutto potrebbe naturalmente essere incapsulato in una classe apposita.
EMG