Somme des chiffres en C#

Quelle est la mise en œuvre la plus rapide et la plus facile à lire du calcul de la somme des chiffres?

C'est-à-dire étant donné le nombre: 17463 = 1 + 7 + 4 + 6 + 3 = 21

33
demandé sur Xn0vv3r 2009-01-26 09:18:47

17 réponses

Vous pouvez le faire arithmétiquement, sans utiliser de chaîne:

sum = 0;
while (n != 0) {
    sum += n % 10;
    n /= 10;
}
90
répondu Greg Hewgill 2009-01-26 06:22:20

J'utilise

int result = 17463.ToString().Sum(c => c - '0');

, Il utilise seulement 1 ligne de code.

34
répondu Chaowlert Chaisrichalermpol 2009-01-26 06:49:20

Pour les nombres entiers, Greg Hewgill a la plupart de la réponse, mais oublie de tenir compte de n

n = Math.Abs(n);
sum = 0;
while (n != 0) {
    sum += n % 10;
    n /= 10;
}

Le nombre est un nombre à virgule flottante, une approche différente devrait être adoptée, et la solution de chaowman échouera complètement quand elle atteindra le point décimal.

16
répondu Ants 2009-01-26 07:49:35
int num = 12346;
int sum = 0;
for (int n = num; n > 0; sum += n % 10, n /= 10) ;
11
répondu Muhammad Hasan Khan 2009-03-05 10:04:10
 public static int SumDigits(int value)
 {
     int sum = 0;
     while (value != 0)
     {
         int rem;
         value = Math.DivRem(value, 10, out rem);
         sum += rem;
     }
     return sum;
 }
10
répondu Jon Skeet 2009-01-26 06:23:03

J'aime la réponse du chaowman, mais ferait un changement

int result = 17463.ToString().Sum(c => Convert.ToInt32(c));

Je ne suis même pas sûr que le c - '0', la syntaxe fonctionnerait? (la soustraction de deux caractères devrait donner un caractère en conséquence, je pense?)

Je pense que c'est la version la plus lisible (en utilisant le mot sum en combinaison avec l'expression lambda montrant que vous le ferez pour chaque caractère). Mais en effet, je ne pense pas que ce sera le plus rapide.

2
répondu Tjipke 2011-03-16 00:55:24

Je pensais juste poster ceci pour l'achèvement:

Si vous avez besoin d'un appel récursif à la somme des chiffres, de l'e.g: 17463 -> 1 + 7 + 4 + 6 + 3 = 21 -> 2 + 1 = 3
alors la meilleure solution serait

int result = input % 9;
return (result == 0 && input > 0) ? 9 : result;
2
répondu Nolonar 2014-12-09 09:39:52

Je suggère que l'implémentation la plus facile à lire serait quelque chose comme:

public int sum(int number)
{
    int ret = 0;
    foreach (char c in Math.Abs(number).ToString())
        ret += c - '0';
    return ret;
}

Cela fonctionne, et est assez facile à lire. BTW: convertir.ToInt32 ('3') donne 51, pas 3. Convertir.ToInt32('3' - '0') donne 3.

Je suppose que L'implémentation la plus rapide est la solution arithmétique de Greg Hewgill.

1
répondu sindre j 2009-03-05 10:16:42
private static int getDigitSum(int ds)
{
    int dssum = 0;            
    while (ds > 0)
    {
        dssum += ds % 10;
        ds /= 10;
        if (dssum > 9)
        {                
            dssum -= 9;
        }
    }
    return dssum;
}

C'est pour fournir la somme des chiffres entre 0-9

1
répondu Kostis Hudalas 2016-05-20 18:31:29

Le moyen le plus simple et le plus simple serait d'utiliser des boucles pour Trouver la somme des chiffres.

int sum = 0;
int n = 1234;

while(n > 0)
{
    sum += n%10;
    n /= 10;
}
0
répondu Pankaj Prakash 2016-01-16 06:23:41
int j, k = 1234;
for(j=0;j+=k%10,k/=10;);
0
répondu Saravanan Daya 2016-04-15 04:59:14
while(ino!=0 )
{
  digit=(ino%10));
  printf("%d",digit);
  ino=ino/10;   
}           

Pour un tableau comme celui-ci i / p: 10 25 712 65

Cela ne fonctionnera pas, vous devez essayer une autre logique si quelqu'un en a un, Veuillez le poster pour l'ajout d'éléments de tableau.

0
répondu sachin bhikule 2016-08-18 14:35:41
#include <stdio.h>

int main (void) {

    int sum = 0;
    int n;
    printf("Enter ir num ");
    scanf("%i", &n);

    while (n > 0) {
        sum += n % 10;
        n /= 10;
    }

    printf("Sum of digits is %i\n", sum);

    return 0;
}
0
répondu Kuanysh Mukayev 2016-09-05 13:39:08

Il y a quelque temps, je devais trouver la somme des chiffres de quelque chose. J'ai utilisé le code de Muhammad Hasan Khan, mais il a continué à renvoyer le bon nombre comme une décimale récurrente, c'est-à-dire quand la somme des chiffres était 4, j'obtiendrais 4.44444444444444 etc. Par conséquent, je l'ai édité, obtenant la somme des chiffres correcte à chaque fois avec ce code:

 double a, n, sumD;
 for (n = a; n > 0; sumD += n % 10, n /= 10);
 int sumI = (int)Math.Floor(sumD);

Où a est le nombre dont vous voulez la somme des chiffres, n est un double utilisé pour ce processus, sumD est la somme des chiffres en double et sumI est la somme des chiffres en entier, donc le chiffre correct somme.

0
répondu Moritz Krämer 2017-05-19 19:05:19
int n = 17463; int sum = 0;
for (int i = n; i > 0; i = i / 10)
{
sum = sum + i % 10;
}
Console.WriteLine(sum);
Console.ReadLine();
0
répondu Stephan Regan 2018-01-05 12:46:10

Surpris personne n'a considéré la méthode de sous-chaîne. Ne sais pas si sa plus efficaces ou pas. Pour tous ceux qui savent comment utiliser cette méthode, c'est assez intuitif pour des cas comme celui-ci.

string number = "17463";
int sum = 0;
String singleDigit = "";
for (int i = 0; i < number.Length; i++)
{
singleDigit = number.Substring(i, 1);
sum = sum + int.Parse(singleDigit);
}
Console.WriteLine(sum);
Console.ReadLine();
-2
répondu cricketycrack 2017-11-10 23:41:00
static int SumOfDigits(int num)
{
    string stringNum = num.ToString();
    int sum = 0;
    for (int i = 0; i < stringNum.Length; i++)
    {
      sum+= int.Parse(Convert.ToString(stringNum[i]));

    }
    return sum;
}
-2
répondu stati.chobanov 2018-05-30 14:25:34