web-dev-qa-db-fra.com

Somme des chiffres en C #

Quelle est l'implémentation 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

34
Xn0vv3r

Vous pouvez le faire de manière arithmétique, sans utiliser de chaîne:

sum = 0;
while (n != 0) {
    sum += n % 10;
    n /= 10;
}
92
Greg Hewgill

J'utilise

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

Il utilise seulement 1 ligne de code.

Pour les nombres entiers, Greg Hewgill a la majeure partie de la réponse, mais il oublie de prendre en compte le n <0. La somme des chiffres de -1234 devrait toujours être de 10, pas de -10.

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

Si le nombre est un nombre à virgule flottante, une approche différente doit être adoptée et la solution de chaowman échouera complètement lorsqu'elle atteindra la virgule décimale.

16
Ants
int num = 12346;
int sum = 0;
for (int n = num; n > 0; sum += n % 10, n /= 10) ;
11
Muhammad Hasan Khan
 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
Jon Skeet

Je pensais que je ne ferais que poster ceci par souci de complétion:

Si vous avez besoin d’une somme récursive de chiffres, par exemple: 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
Nolonar

J'aime la réponse du chaowman, mais je ferais 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? (soustraire deux caractères devrait donner un caractère comme résultat, je pense?)

Je pense que c'est la version la plus lisible (utiliser la somme de mots 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
Tjipke
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 et 9

1
Kostis Hudalas

Je suggérerais que la mise en œuvre 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: Convert.ToInt32 ('3') donne 51, pas 3. Convert.ToInt32 ('3' - '0') donne 3.

Je suppose que la solution la plus rapide est la solution arithmétique de Greg Hewgill.

1
sindre j
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
Stephan Regan

Il y a quelque temps, je devais trouver la somme en chiffres de quelque chose. J'ai utilisé le code de Muhammad Hasan Khan, mais le nombre correct renvoyait le bon nombre sous forme décimale récurrente, c'est-à-dire que lorsque la somme des chiffres était 4, je recevais 4.44444444444444 etc. . 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, n est un double utilisé pour ce processus, sumD est la somme de chiffres en double et sumI est la somme de chiffres en entier, donc la somme de chiffres correcte.

0
Moritz Krämer
#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
Kuanysh Mukayev

La méthode la plus simple et la plus simple consiste à utiliser des boucles pour trouver la somme des chiffres .

int sum = 0;
int n = 1234;

while(n > 0)
{
    sum += n%10;
    n /= 10;
}
0
Pankaj Prakash
int j, k = 1234;
for(j=0;j+=k%10,k/=10;);
0
Saravanan Daya
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 devrez essayer une autre logique si quelqu'un en a une, merci de l'afficher pour l'ajout d'éléments de tableau.

0
sachin bhikule