Ritornando con la mente ai tempi delle elementari (ai miei tempi si chiamavano così, non "primaria" come oggi) mi è venuta la voglia di implementare la prova del 9 in linguaggio C.

moltipl 420 280

Per chi non lo sapesse, la prova del 9 è un sistema per verificare la correttezza del risultato della moltiplicazione fra due operandi; in realtà il superamento di questa prova non certifica che il risultato sia corretto, infatti ci sono degli errori (come lo scambio di posizione delle cifre) che non possono essere rilevati.

Volendo utilizzare il procedimento corretto (confesso che non me lo ricordavo) e la terminologia appropriata, ho fatto qualche ricerca su Internet.

Innanzitutto il procedimento è spiegato molto bene su wikipedia https://it.wikipedia.org/wiki/Prova_del_nove: l'implementazione della sequenza si trova nella funzione ProvaDel9() in cui eseguo anche una stampa a video della croce in cui, per consuetudine, si inseriscono i valori calcolati.

La somma delle cifre di un numero si chiama radice numerica (vedi https://it.wikipedia.org/wiki/Radice_numerica): in pratica bisogna sommare fra di loro tutte le cifre del numero e procedere ricorsivamente finchè non rimaniamo con un'unica cifra (ovvero un valore da 0 a 9). Il calcolo della radice numerica è implementato nella funzione RadiceNumerica() che riceve in input il valore e restituisce come risultato la radice numerica calcolata. La funzione avrebbe potuto sfruttare la ricorsività, ovvero richiamare se stessa se il risultato ottenuto è composto da più di una cifra ma, sebbene forse meno elegante, ho preferito implementarla con un semplice ciclo while.

Qui sotto il programma completo... Buon divertimento!!!

#include <stdio.h>
#include <stdlib.h>

int RadiceNumerica(int val)
{
    int sum;

    if (val < 0)            // determina valore assoluto (elimina segno)
        val = -val;

    while (val >= 10)        // il ciclo viene eseguito finchè non rimane una sola cifra    
    {
        sum = 0;
        while (val > 0)        // calcola la somma di tutte le cifre
        {
            sum += val % 10;
            val = val / 10;
        }
        val = sum;        
    }
    return val;
}

int ProvaDel9(int a, int b, int p)
{
    int c;
    int ra;
    int rb;
    int rc;
    int rp;

    ra = RadiceNumerica(a);
    rb = RadiceNumerica(b);

    c = ra*rb;
    rc = RadiceNumerica(c);

    rp = RadiceNumerica(p);

    printf("\n %5d | %5d", ra, rb);
    printf("\n       |      ");
    printf("\n ------+------");
    printf("\n       |      ");
    printf("\n %5d | %5d", rc, rp);
    printf("\n");

    if (rc == rp)
        return 1;
    else
        return 0;
}

int InputInt(char *message)
{
    int val = 0;
    char buff[128];

    printf(message);
    
    strcpy(buff, "");
    if(fgets(buff, 128, stdin))
        val = atoi(buff);

    return val;
}

int main(int argc, char **argv)
{
    int a;
    int b;
    int p;

    a = InputInt("\nInserisci il moltiplicando:");
    b = InputInt("\nInserisci il moltiplicatore:");
    p = InputInt("\nInserisci il prodotto:");

    if( ProvaDel9(a, b, p) )
        printf("\nVerifica OK");
    else
        printf("\nVerifica KO");

    return 0;
}