Un'altra variazione sul utilizzando stringhe per fare la scissione:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int split(int val, int *top, int *bot)
{
char tmp[23]; // should be large enough to hold a 64-bit decimal integer
// plus sign plus 0 terminator
char low[12] = {0};
char high[12] = {0};
if (val < 0)
val = -val;
sprintf(tmp, "%d", val);
if (strlen(tmp) % 2)
return 0;
strncpy(low, tmp, strlen(tmp)/2);
strncpy(high, tmp + strlen(tmp)/2, strlen(tmp)/2);
*top = (int) strtol(low, NULL, 10);
*bot = (int) strtol(high, NULL, 10);
return val;
}
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf(stderr, "USAGE: %s integer_value_with_even_number_of_digits\n", argv[0]);
exit(0);
}
int val = (int) strtol(argv[1], NULL, 10);
int lo, hi;
if (split(val, &lo, &hi))
printf("val: %d, lo: %d, hi: %d\n", val, lo, hi);
else
fprintf(stderr, "USAGE: %s integer_value_with_even_number_of_digits\n", argv[0]);
exit(0);
}
alcune piste di esempio:
[[email protected]]~/prototypes/splitter: ./splitter 1
USAGE: ./splitter integer_value_with_even_number_of_digits
[[email protected]]~/prototypes/splitter: ./splitter 12
val: 12, lo: 1, hi: 2
[[email protected]]~/prototypes/splitter: ./splitter -12
val: -12, lo: 1, hi: 2
[[email protected]]~/prototypes/splitter: ./splitter -123
USAGE: ./splitter integer_value_with_even_number_of_digits
[[email protected]]~/prototypes/splitter: ./splitter -1234
val: -1234, lo: 12, hi: 34
[[email protected]]~/prototypes/splitter: ./splitter 12345678
val: 12345678, lo: 1234, hi: 5678
[[email protected]]~/prototypes/splitter: ./splitter -1234567890
val: -1234567890, lo: 12345, hi: 67890
[[email protected]]~/prototypes/splitter: ./splitter 012
val: 12, lo: 1, hi: 2
[[email protected]]~/prototypes/splitter: ./splitter 0
val: 123456, lo: 123, hi: 456
[[email protected]]~/prototypes/splitter: ./splitter 0
USAGE: ./splitter integer_value_with_even_number_of_digits
Lei non ha menzionato se i valori dovessero essere positivi o no, o se gli zeri contano il numero di cifre (dal momento che è letta come un valore intero e non una stringa, non ci sono zeri iniziali dopo la conversione).
Per me, questo codice ha il pregio della semplicità. Stiamo essenzialmente trattando il numero come una stringa di cifre da suddividere in mezzo, quindi (almeno nella mia mente), l'uso delle stringhe mi è sembrato il più semplice. Per quanto riguarda le prestazioni, questo non dovrebbe essere più lento dell'utilizzo di log
per ottenere le cifre e il loro ciclo.
Per favore guidami, non possiamo fare qualcosa del genere? \t prima convertire int in stringa tramite sprintf e quindi sottostringa e quindi riconvertire in int ?? Come fare questo ? – Prateek
La tua domanda è molto poco chiara. Forse se lo fai bene, troverai già la risposta da solo. – Olaf
Ho detto il numero di cifre nel numero .. entrambi hanno 4 e 6 cifre che sono multipli di 2 – Prateek