separables - C: ¿cómo dividir un número de varios dígitos en variables separadas?
edo separacion de variables (11)
Como sugerencia, obtener el número n en el número es bastante fácil; divide por 10 n veces, luego mod 10, o en C:
int nthdig(int n, int k){
while(n--)
k/=10;
return k%10;
}
Digamos que tengo un entero de varios dígitos en C. Quiero dividirlo en enteros de un solo dígito.
123
se convertiría en 1
, 2
y 3
.
¿Cómo puedo hacer esto, especialmente si no sé cuántos dígitos tiene el entero?
Creo que debajo del código ayudará ...
temp = num;
while(temp)
{
temp=temp/10;
factor = factor*10;
}
printf("/n%d/n", factor);
printf("Each digits of given number are:/n");
while(factor>1)
{
factor = factor/10;
printf("%d/t",num/factor);
i++;
num = num % factor;
}
El último dígito de 123 es 123% 10. Puede eliminar el último dígito de 123 haciendo 123/10 - usando división de enteros esto le dará 12. Para responder su pregunta sobre "cómo sé cuántos dígitos tiene" - intente hacerlo como se describe arriba y verá cómo saber cuándo detenerse.
Hice esto basado en el código de @asaelr:
typedef struct digitsArrayPlusNumber {
uint32_t *baseAddress;
uint32_t number;
} digitsArrayPlusNumber;
digitsArrayPlusNumber *splitDigits (uint32_t inValue) {
// based on code from [email protected]
uint32_t inputValue = inValue;
//Count digits
uint32_t theCount = 1;
while (inputValue /= 10)
theCount++;
// put in array
uint32_t *arr = malloc(sizeof(uint32_t) * theCount);
uint32_t dig = theCount;
while (dig--) {
arr[dig]=inValue % 10;
inValue /= 10;
// printf ("%d/n", arr[dig]);
}
digitsArrayPlusNumber *dandn = malloc (sizeof(digitsArrayPlusNumber));
dandn->baseAddress = arr;
dandn->number = theCount;
return dandn;
}
int main(int argc, const char * argv[]) {
for (int d = 0; d < splitDigits(12345678)->number; d++)
printf ("%u/n", (splitDigits(12345678)->baseAddress)[d]);
}
Funciona bastante bien, gracias!
Intente este código si desea separar los dígitos en el mismo orden sin utilizar matrices.
//Separate number digits
#include <stdio.h>
#include <math.h>
void main()
{
int x, y, n = 0;
scanf("%d", &x);
//counting digits
y = x;
while (y != 0)
{
n += 1;
y /= 10;
}
//printing separated digits
int i;
for (i = ceil(pow(10, (n - 1))); i != 0; i /= 10)
printf("%d ", (x / i) % 10);
}
Primero, cuenta los dígitos:
unsigned int count(unsigned int i) {
unsigned int ret=1;
while (i/=10) ret++;
return ret;
}
Luego, puedes almacenarlos en una matriz:
unsigned int num=123; //for example
unsigned int dig=count(num);
char arr[dig];
while (dig--) {
arr[dig]=num%10;
num/=10;
}
Puede usar% 10, que significa el resto si el número después de dividirlo. Entonces 123 % 10
es 3, porque el resto es 3, resta el 3 de 123, luego es 120, luego divide 120 con 10, que es 12. Y haz el mismo proceso.
Puedes dividir y conquistar, pero has reescrito todas las bibliotecas aritméticas. Sugiero usar una biblioteca de precisión múltiple https://gmplib.org Pero, por supuesto, es una buena práctica
podemos usar este programa como una función con 3 argumentos. Aquí, en "while (a ++ <2)", 2 es el número de dígitos que necesita (puede dar como un solo argumento), reemplace 2 por el número de dígitos que no necesite. Aquí podemos usar "z / = pow (10,6)" si no necesitamos los últimos dígitos determinados, reemplace 6 por el número de dígitos que no necesita (se puede dar como otro argumento), y el tercer argumento es El número que necesitas para romper.
int main(){
long signed c=0,z,a=0,b=1,d=1;
scanf("%ld",&z);
while(a++<2){
if(d++==1)
z/=pow(10,6);
c+=(z%10)*b;
z/=10;
b*=10;}
return c;}
//Based on Tony''s answer
#include <stdio.h>
int nthdig(int n, int k){
while(n--)
k/=10;
return k%10;
}
int main() {
int numberToSplit = 987;
printf("Hundreds = %i/n",nthdig(2, numberToSplit));
printf("Tens = %i/n",nthdig(1, numberToSplit));
printf("Units = %i/n",nthdig(0, numberToSplit));
}
Esto da como resultado la siguiente impresión:
Cientos = 9
Decenas = 8
Unidades = 7
int value = 123;
while (value > 0) {
int digit = value % 10;
// do something with digit
value /= 10;
}