Additionner les chiffres d'un nombre

Résolu
cs_Loonis Messages postés 23 Date d'inscription jeudi 14 septembre 2006 Statut Membre Dernière intervention 30 mars 2007 - 14 sept. 2006 à 21:47
rajaben Messages postés 1 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 19 février 2009 - 19 févr. 2009 à 17:45
Bonjour à tous,


Je recherche une méthode pour additionner les chiffres d'un nombre en c++, exemple

15 : 1+5=6


Merci.

17 réponses

cs_chuckboy Messages postés 64 Date d'inscription vendredi 16 septembre 2005 Statut Membre Dernière intervention 31 mars 2009 1
14 sept. 2006 à 21:54
Facile
-Pour 15
-15 / 10= 1
-15 % 10 = 5
-T additionne le tout

Si t a une chiffre plus grand tu divise par 1000 , par 100 , par 10 et tu finit par % 10

a+
1
cs_Loonis Messages postés 23 Date d'inscription jeudi 14 septembre 2006 Statut Membre Dernière intervention 30 mars 2007
14 sept. 2006 à 23:19
Merci.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 sept. 2006 à 23:32
Allez pour le fun:

__declspec(naked) DWORD __fastcall bnSumFromDWORD(DWORD n)
{ // ECX = val32
  __asm {
    mov     [esp-4], ebx
    test    ecx, ecx
    jnz     short L1
    xor     eax, eax
    ret     0
 L1:
    xor     ebx, ebx
 L2:
    mov     eax, -858993459
    mul     ecx
    mov     eax, edx
    shr     eax, 3
    mov     edx, ecx
    lea     ecx, [eax+eax*8]
    add     ecx, eax
    sub     edx, ecx
    add     ebx, edx
    mov     ecx, eax
    test    eax, eax
    jnz     short L2
    mov     eax, ebx
    mov     ebx, [esp-4]
    ret     0
  }
}


void __stdcall TestSum()
{
  char szsum[12], szdword[12];
  DWORD v;
  v = GetTickCount();
  ultoa(v, szdword, 10);
  ultoa(bnSumFromDWORD(v), szsum, 10);
  MessageBox(0, szsum, szdword, 0);
}

ciao...
BruNews, MVP VC++
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
14 sept. 2006 à 23:45
Tu pousses le bouchon un peu trop loin BruNews :)

ULARGE_INTEGERJokyQi=QI("Joky"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 sept. 2006 à 23:51
ah le fun, c'est le fun.
Non mais...

ciao...
BruNews, MVP VC++
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
14 sept. 2006 à 23:53
Qu'est-ce-que j'aimerai m'amuser ainsi :)

ULARGE_INTEGERJokyQi=QI("Joky"
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 sept. 2006 à 00:23
ok un dernier mumuse, idem en 2 instructions de moins:

__declspec(naked) DWORD __fastcall bnSumFromDWORD(DWORD n)
{ // ECX = val32
  __asm {
    mov     [esp-4], ebx
    test    ecx, ecx
    jnz     short L1
    xor     eax, eax
    ret     0
 L1:
    xor     ebx, ebx
 L2:
    mov     eax, -858993459
    mul     ecx
    shr     edx, 3
    lea     eax, [edx+edx*8]
    add     eax, edx
    add     ebx, ecx
    sub     ebx, eax
    mov     ecx, edx
    test    edx, edx
    jnz     short L2
    mov     eax, ebx
    mov     ebx, [esp-4]
    ret     0
  }
}

ciao...
BruNews, MVP VC++
0
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
15 sept. 2006 à 02:12
hmm hmm, mais pourquoi Loonis n'a t'il pas validé la réponse à brunews lol :-)
En cours d'info faudrait que je fasse ça, car le faire en ada c'est trop simple/rapide
Ca me pete les bonbons d'attendre que les autres finissent, et comme ça c'est utile autant passer du temps dessus, mais par contre faut pas compter sur le prof pour corriger lol.

/* MuPuF®, pour vous servir
0
cs_magma Messages postés 198 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 18 mars 2011
15 sept. 2006 à 16:27
 


 



int SommeChiffres(__int64 nombre)
{
  char buf[32];  int i 0, somme 0;
 
  sprintf(buf, "%I64d", nombre);
  while(buf[i]) somme += buf[i++] - '0';
   
  return somme;
}

printf("Somme des chiffres de %I64d = %d\n", 
        nombre, SommeChiffres(nombre));
0
cs_magma Messages postés 198 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 18 mars 2011
15 sept. 2006 à 16:33
Avec

__int64 nombre = 9876543210;

par exemple.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 sept. 2006 à 18:16
sprintf pour cela, c'est hyper long.

ciao...
BruNews, MVP VC++
0
cs_magma Messages postés 198 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 18 mars 2011
15 sept. 2006 à 18:59
Ce n'est qu'un exemple parmi d'autres, BruNews.
A+
0
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 1
17 sept. 2006 à 20:51
Salut,
ma question est pour BruNews ...

Par curiosité j'ai essayé ta fonction seulement je ne sais pas comment récupérer le résultat.
Ca peut paraitre bête mais je ne suis pas du tout habitué à employer des fonctions de ce genre.

Ma question est donc :   La somme est'elle retournée ou stockée quelquepart, ou bien faut'il rajouter des lignes ?

Merci.

eRoZion
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 sept. 2006 à 21:00
Que veux-tu rajouter à une fonction ???

__declspec(naked) DWORD __fastcall bnSumFromDWORD(DWORD n)
{ // ECX = n
  __asm {
    mov     [esp-4], ebx
    xor     ebx, ebx
    test    ecx, ecx
    je      short sumEXIT
 L1:
    mov     eax, -858993459
    mul     ecx
    shr     edx, 3
    lea     eax, [edx+edx*8]
    add     eax, edx
    add     ebx, ecx
    sub     ebx, eax
    mov     ecx, edx
    test    edx, edx
    jnz     short L1
 sumEXIT:
    mov     eax, ebx
    mov     ebx, [esp-4]
    ret     0
  }
}

void Test()
{
  char buf[12];
  DWORD n = 128; // UNE VALEUR AU HASARD
  ultoa(bnSumFromDWORD(N), buf, 10);
  MessageBox(0, buf, "128", 0);
}

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 sept. 2006 à 21:02
OUPS, en minuscule 'n'
ultoa(bnSumFromDWORD(n), buf, 10);

ou encore:
void Test()
{
  char buf[12];
  DWORD n = bnSumFromDWORD(128); // UNE VALEUR AU HASARD
  ultoa(n, buf, 10);
  MessageBox(0, buf, "128", 0);
}

ciao...
BruNews, MVP VC++
0
cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 1
17 sept. 2006 à 22:32
Autant pour moi BruNews...

En fait ce qui se passait c'est que je compilais avec Borland C++, j'ai eu beau essayer de plusieurs façons, impossible d'avoir une valeur de retournée avec ta fonction.
Là je suis sur une autre machine du réseau et avec VS aucun problème ne se fait sentir.

Je te remercie de ta réponse rapide.

eRoZion
0
rajaben Messages postés 1 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 19 février 2009
19 févr. 2009 à 17:45
Salut, merci pour la solution. c'est très ingénieur !!!!
0
Rejoignez-nous