2010-02-22 2 views

Répondre

2

L'algorithme en général:

(10 - (somme des chiffres mod 10) + 1) mod 10

La réponse de l'expression ci-dessus est votre chiffre nécessaire.

La somme des chiffres mod 10 vous donne le reste actuel, quand vous soustrayez ceci de 10 vous obtenez la valeur nécessaire pour un reste de 0. Lorsque vous ajoutez 1, vous obtenez la valeur nécessaire pour obtenir un reste de 1. Le dernier Le mod 10 vous donne la réponse sous la forme d'un nombre à un chiffre.

Donc, en C# quelque chose comme ceci:

static int getNewValue(string s) 
    { 
     int sum = 0; 
     foreach (char c in s) 
     { 
      sum += Convert.ToInt32(c.ToString()); 
     } 
     int newDigit = (10 - (sum % 10) + 1) % 10; 
     return newDigit; 
    } 
+0

En fait, si la somme des chiffres mod 10 est 0, votre expression donne 11. L'correcte est (10 - (somme des chiffres mod 10) + 1) mod 10. Ou, de manière équivalente, (1 - somme des chiffres) mod 10. [Puisque selon la convention théorique-numérique habituelle, (-33 mod 10) est 7, etc.] Ceci donne une réponse qui est toujours entre 0 et 9. – ShreevatsaR

+0

@ShreevatsaR: Yup merci fixé. –

3

Les algorithmes indépendants de la langue. Demander "un algorithme en C#" n'a pas beaucoup de sens.

En demandant l'algorithme (comme s'il n'y en a qu'un) est également mal orienté.

Alors, faisons cela étape par étape. D'abord, nous notons que seul le dernier chiffre du résultat est significatif. Donc, nous allons résumer nos chiffres existants, puis ignorer tout sauf le dernier. Donc, nous avons la somme des chiffres existants, et nous voulons ajouter un autre chiffre à cela, de telle sorte que la somme des deux se termine par une somme de . 1. Pour la grande majorité des cas, cela signifie sum + newDigit = 11. Réarrangement donne newDigit = 11 - sum

On peut alors prendre ce modulo 10 (à nouveau) afin de le réduire à un seul chiffre.

Enfin, nous multiplions le nombre original par 10, et nous y ajoutons notre nouveau chiffre.

0

Une autre alternative utilisant mod une seule fois

int sum = 0; 
    foreach (char c in s) 
     sum += Convert.ToInt32(c.ToString()); 
    int diff = 0; 
    while (sum % 10 != 1) 
    { 
     sum++; 
     diff++; 
    } 
    if (diff > 0) 
     s += diff.ToString(); 
0

Eh bien, il est plus facile en C++.

std::string s = boost::lexical_cast<string>(i); 
i = i * 10 + 9 - std::accumulate(s.begin(), s.end(), 8 - '0' * s.size()) % 10; 

Addicted au code golf ...

Questions connexes