PDA

Visualizza la versione completa : [C/C++]: Scomporre un int in singole cifre


alexx82
05-09-2006, 17:12
Devo implementare in C una funzione che determina se un numero inserito un numero harshad, (un numero Harshad se divisibile per il numero ottenuto sommando le sue cifre).
Il mio problema come posso ricavare dal numero N le sue singole cifre da sommare? Ad esempio se ho il numero 1279, avr bisogno di calcolare la somma di 1+2+7+9. come le ricavo?

:dh:

Nikk11
05-09-2006, 17:35
io convertirei il numero in stringa, leggerei un carattere x volta che converto in intero e sommo al totale...
per nn saprei come tradurlo in C :fagiano:

Ciao :ciauz:

zero85
05-09-2006, 17:37
Cos su 2 piedi ho scritto questo, ma quasi sicuramente si pu ottimizzare...


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
char buffer[32];
int numero;
int somma=0;
printf("Inserisci il numero: ");
scanf("%d",&numero);
itoa(numero,buffer,10);
for(unsigned int i = 0; i < strlen(buffer); i++)
{
somma += (buffer[i]-48);
}
if((numero%somma) == 0)
printf("Il numero %d e' Harshad\n", numero);
else
printf("Il numero %d non e' Harshad\n", numero);
system("pause");
return 0;
}

Xaratroom
05-09-2006, 17:46
Se il numero lo devi leggere come intero devi creare una procedura che ti permetta (attraverso divisioni intere) di ricavare le singole cifre.

alexx82
05-09-2006, 19:10
ma nel C supportata la funzione "itoa"? o un funzione che fa parte del C++?

perch, in fase di compilazione mi d il seguente errore: "undefined reference to `itoa"

Sul mio manuale documentata solo quella inversa cio: "Atoi(const char *nptr)"

zero85
05-09-2006, 19:25
in effetti itoa non una funzione ANSI-C ma supportata da moltissimi compilatori. che compilatore usi? stai usando flag di compilazione che impongono di usare ANSI-C?

Nel caso dovessi usare solo ansi-c ti conviene scrivere una tua versione di itoa, una cosa simile (il codice sorgente della funzione itoa):


char *itoa(int value, char *string, int radix)
{
char tmp[33];
char *tp = tmp;
int i;
unsigned v;
int sign;
char *sp;

if (radix > 36 || radix <= 1)
{

return 0;
}

sign = (radix == 10 && value < 0);
if (sign)
v = -value;
else
v = (unsigned)value;
while (v || tp == tmp)
{
i = v % radix;
v = v / radix;
if (i < 10)
*tp++ = i+'0';
else
*tp++ = i + 'a' - 10;
}

if (string == 0)
string = (char *)malloc((tp-tmp)+sign+1);
sp = string;

if (sign)
*sp++ = '-';
while (tp > tmp)
*sp++ = *--tp;
*sp = 0;
return string;
}

f@nt@m@n
06-09-2006, 00:00
Premetto che io sono agli inizi, ma mi capitato un esercizi del genere.



#include <stdio.h>

int main()
{
int n, temp1, temp2, n1, n2, n3, n4;

printf ("Inserisci un numero (4 cifre): ");
scanf ("%d", &n);

temp1 = n;
n1 = temp1 / 1000;
temp2 = temp1 % 1000;
n2 = temp2 / 100;
temp1 = temp2 % 100;
n3 = temp1 / 10;
n4 = temp1 % 10;

printf ("le cifre che compongono %d sono %d %d %d %d", n, n1, n2, n3, n4);

system ("pause");
return 0;
}


Questo per quattro cifre. Altrimenti lo modifichi di conseguenza. :ciauz:

zero85
06-09-2006, 02:41
Anche questo metodo funziona per c' da stare attenti: con l'aumento delle cifre bisogna usare pi variabili d'appoggio e pi operazioni, diventerebbe assai scomodo con valori molto alti senza contare che bisognerebbe conoscere a priori la lunghezza del numero... Insomma molto pi comodo con un itoa

infinitejustice
06-09-2006, 04:59
int numero = xxx; //il numero di cui vuoi fare la somma delle cifre
int somma;

for(somma = 0; numero > 0; numero /= 10)
somma += numero % 10;

dopo il ciclo somma ha la somma delle cifre del numero.


Mi ricorda l'esame di programmazione :zizi:

Loading