Newsgroup: it.comp.lang.c++
Titolo: Gara di C++Informer

Salve,
visto che Pescio propone di rendere ad oggetti il codice da me presentato, ne posto una
nuova versione in cui scompare definitivamente la parte iterativa.
Non mi sembrava di essere stato poco chiaro, almeno fino alla parte ricorsiva :-)
Comunque, ci vedo un solo modo di usare la programmazione ad oggeti. Creare una
interfaccia base tipo:
template <class T>
class getLastDigitOf
{
  public:
    virtual ~getLastDigit() {}
    virtual T run(T val) = 0;
};
poi, derivare e rendere metodi della classe le funzioni statiche usate.
Ma questo solo per avere una interfaccia comune a una stessa classe di problemi.
Forse nella soluzione classica l'operazione (prodotto o altro, dipendente dal problema)
poteva essere una funzione virtuale pura messa nella classe base, ma la mia soluzione e'
troppo specifica del problema.
Spero di non essere OT :-)
Ciao
Nazzareno
//-------inizio codice---------
#include <iostream.h>
#include <dos.h>
#include <stdio.h>
#include <conio.h>
//-----------------------------------------------------------
// prototipi
static int lsb_pow(int c,long n);
static long how_many_five(long n);
static int calcola_lsb(long n);
static int calcola(long n);
//-----------------------------------------------------------
static int lsb_pow(int c,long n)
{
  int t;
  static const char a2[] = { 2, 4, 8, 6 };
  static const char a3[] = { 3, 9, 7, 1 };
  static const char a7[] = { 7, 9, 3, 1 };
  static const char a8[] = { 8, 4, 2, 6 };
  switch(c) {
    case 2:
      t = (n-1) % 4;
      return a2[t];
    case 3:
      t = (n-1) % 4;
      return a3[t];
    case 4:
      if(n & 1)
        return 4;
      return 6;
    case 6:
      return 6;
    case 7:
      t = (n-1) % 4;
      return a7[t];
    case 8:
      t = (n-1) % 4;
      return a8[t];
    case 9:
      if(n & 1)
        return 9;
      return 1;
    }
  return 1;
}
//-----------------------------------------------------------
static long how_many_five(long n)
{
  long pr=0;
  while(n >= 5) {
    n /= 5;
    pr += n;
    }
  return pr;
}
//-----------------------------------------------------------
static int calcola_lsb(long n)
{
  int ret=1;
  if(n > 5)
    ret = calcola_lsb(n/5);
  long t = n / 10;
  int r = n % 10;
  int i;
  if(t)
    for(i=2;i<10;++i)
      if(i != 5) {
        ret *= lsb_pow(i,t);
        ret %= 10;
        }
  for(i=2;i<=r;++i)
    if(i != 5) {
      ret *= i;
      ret %= 10;
      }
  return ret;
}
//-----------------------------------------------------------
static int calcola(long n)
{
  int ret = calcola_lsb(n);
  int five = how_many_five(n) & 3;
  while(five > 0) {
    if(!(ret & 3))
      ret /= 2;
    else
      ret = (ret + 10) /2;
    --five;
    }
  return ret % 10;
}
//-----------------------------------------------------------
int main()
{
  long num;
  cout << endl;
  for(;;) {
    cout << "Immettere il numero ( <= 0 per terminare) ";
    cin >> num;
    if(num <= 0)
      break;
    int ret = calcola(num);
    cout <<  " Risultato di " << num << " e' " << ret << endl;
    }
  return 0;
}
//----------- fine codice --------------------

 nuova versione in cui scompare definitivamente la parte iterativa.
Io ho letto C++ Informer e quindi so di cosa stai parlando. Ma chi non
l'ha letto non sa neanche (e tu non l'hai scritto nel messaggio) cosa
dovrebbe fare il tuo programma. E comunque metterci qualche commento e
magari una breve descrizione dell'algoritmo utilizzato non sarebbe stata
una cosa negativa. Non ti pare?
EMG