Additionner les chiffres d'un nombre [Résolu]

Signaler
Messages postés
23
Date d'inscription
jeudi 14 septembre 2006
Statut
Membre
Dernière intervention
30 mars 2007
-
Messages postés
1
Date d'inscription
mardi 20 novembre 2007
Statut
Membre
Dernière intervention
19 février 2009
-
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

Messages postés
64
Date d'inscription
vendredi 16 septembre 2005
Statut
Membre
Dernière intervention
31 mars 2009
1
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+
Messages postés
23
Date d'inscription
jeudi 14 septembre 2006
Statut
Membre
Dernière intervention
30 mars 2007

Merci.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Tu pousses le bouchon un peu trop loin BruNews :)

ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
ah le fun, c'est le fun.
Non mais...

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

ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

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
Messages postés
198
Date d'inscription
vendredi 4 avril 2003
Statut
Membre
Dernière intervention
18 mars 2011
1
 


 



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));
Messages postés
198
Date d'inscription
vendredi 4 avril 2003
Statut
Membre
Dernière intervention
18 mars 2011
1
Avec

__int64 nombre = 9876543210;

par exemple.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
sprintf pour cela, c'est hyper long.

ciao...
BruNews, MVP VC++
Messages postés
198
Date d'inscription
vendredi 4 avril 2003
Statut
Membre
Dernière intervention
18 mars 2011
1
Ce n'est qu'un exemple parmi d'autres, BruNews.
A+
Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Statut
Membre
Dernière intervention
8 octobre 2007
1
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
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Statut
Membre
Dernière intervention
8 octobre 2007
1
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
Messages postés
1
Date d'inscription
mardi 20 novembre 2007
Statut
Membre
Dernière intervention
19 février 2009

Salut, merci pour la solution. c'est très ingénieur !!!!