¿Cómo obtengo los dígitos de un número en C++ sin convertirlo en cadenas o matrices de caracteres?¿Cómo obtener los dígitos de un número sin convertirlo en una matriz de cadena/char?
Respuesta
Los siguientes impresiones de los dígitos en orden ascendente de importancia (es decir, unidades, luego decenas, etc.):
do {
int digit = n % 10;
putchar('0' + digit);
n /= 10;
} while (n > 0);
if (n == 0) no se imprimen dígitos. – xtofl
@xtofl: Gracias, corregido. –
¿Esperas algo cuando n == 0? Esperaría que fuera una entrada inválida, un comportamiento indefinido o una afirmación. –
Utilice una secuencia de operaciones mod 10 y div 10 (cualquiera que sea la sintaxis en C++) para asignar los dígitos uno a la vez a otras variables.
En pseudocódigo
lsd = number mod 10
number = number div 10
next lsd = number mod 10
number = number div 10
etc ...
doloroso! ... pero sin cadenas o matrices de caracteres.
Primer dígito (menos significativo) = num% 10, segundo dígito = piso (num/10)% 10, tercer dígito = piso (num/100)% 10. etc
Solución agradable y general. Sin embargo, pasar por la función 'piso 'flotante no tiene mucho sentido. ¡Echa un vistazo a la solución de Martin también! – xtofl
Bueno ... en realidad no usaría piso() pero lo incluí en caso de que el OP estuviera usando flotadores o lo que sea ... solo para hacerlo explícito. Si usa int, entonces no hay problema, no es necesario. – mpen
Algo como esto:
int* GetDigits(int num, int * array, int len) {
for (int i = 0; i < len && num != 0; i++) {
array[i] = num % 10;
num /= 10;
}
}
el MOD 10 le conseguirán los dígitos. Los div 10s avanzarán el número.
Puede que no tenga 'len' - es mejor terminar cuando' num' llegue a 0. –
Buen punto. Necesitamos len para asegurarnos de no sobrepasar el array. Agregó un cheque para num siendo 0 sin embargo. –
Esto se puede refactorizar fácilmente para generar dígitos para cualquier base. Por ahora genera dígitos solo para la base 10 ... – SadSido
¿Quieres algo como esto?
int n = 0;
std::cin>>n;
std::deque<int> digits;
if(n == 0)
{
digits.push_front(0);
return 0;
}
n = abs(n);
while(n > 0)
{
digits.push_front(n % 10);
n = n /10;
}
return 0;
Dado que todo el mundo está haciendo sonar sin saber la pregunta.
Aquí está mi intento de futilidad:
#include <iostream>
template<int D> int getDigit(int val) {return getDigit<D-1>(val/10);}
template<> int getDigit<1>(int val) {return val % 10;}
int main()
{
std::cout << getDigit<5>(1234567) << "\n";
}
¡Bonito! ¡Y también funciona a cero! – xtofl
Aunque la complejidad del tiempo de ejecución es O (sizeof (int)^2) al calcular todos los dígitos. Hmm ... ¿Y cómo sabes en qué dígito comenzar? – xtofl
Técnicamente, la complejidad del tiempo de ejecución es O (1) porque el código no cambiará para diferentes valores de entrada. Nota La notación de Big O es una medida de cómo el tiempo de ejecución se escala en relación con los argumentos de entrada. –
¿Qué hay de floor(log(number))+1
?
Con n dígitos y usando la base b se puede expresar cualquier número hasta pow(b,n)-1
. Entonces para obtener el número de dígitos de un número x en la base b puede usar la función inversa de exponenciación: logaritmo base-b. Para tratar con resultados no enteros, puede usar el truco floor()+1
.
PD: Esto funciona para enteros, no para números con decimales (en ese caso, debe saber cuál es la precisión del tipo que está utilizando).
+1 log usando log. – dmeister
Después de dos años, todavía no entiendo por qué esta respuesta no fue tan buena como las demás. – tunnuz
No puede usar 'ceil (log (x))' en lugar de 'floor (log (x)) + 1' como' ceil' devuelve valores incorrectos cuando 'log (x)% 1 == 0' (por ejemplo, cuando 'x = 100' esperas obtener _3_ (usando' floor + 1') en lugar de _2_ (usando solo 'ceil'). – cruizh
he visto muchas respuestas, pero todas se olvidó de usar do {...} while()
bucle, que es en realidad la forma canónica para resolver este problema y manejar adecuadamente 0
.
Mi solución se basa en this uno por Naveen.
int n = 0;
std::cin>>n;
std::deque<int> digits;
n = abs(n);
do {
digits.push_front(n % 10);
n /= 10;
} while (n>0);
No es tan fría como la respuesta de Martin York, pero frente a sólo un problema arbitraria:
puede imprimir un número entero positivo mayor que cero y no simplemente con la repetición:
#include <stdio.h>
void print(int x)
{
if (x>0) {
print(x/10);
putchar(x%10 + '0');
}
}
Esta voluntad imprima el dígito menos significativo al último. Hace
años, en respuesta a las preguntas anteriores que iba a escribir el siguiente código:
int i2a_old(int n, char *s)
{
char d,*e=s;//init begin pointer
do{*e++='0'+n%10;}while(n/=10);//extract digits
*e--=0;//set end of str_number
int digits=e-s;//calc number of digits
while(s<e)d=*s,*s++=*e,*e--=d;//reverse digits of the number
return digits;//return number of digits
}
creo que la función printf (...) hace algo por el estilo.
Ahora voy a escribir esto:
int i2a_new(int n, char *s)
{
int digits=n<100000?n<100?n<10?1:2:n<1000?3:n<10000?4:5:n<10000000?n<1000000?6:7:n<100000000?8:n<1000000000?9:10;
char *e=&s[digits];//init end pointer
*e=0;//set end of str_number
do{*--e='0'+n%10;}while(n/=10);//extract digits
return digits;//return number of digits
}
Ventajas: mesa de de búsqueda autónoma; C, C++, Java, JavaScript, compatible con PHP; obtener número de dígitos, min comparisons: 3
; obtener número de dígitos, max comparisons: 4
; código rápido; una comparación es muy simple y rápida: cmp reg, immediate_data
-> 1 reloj de la CPU.
Su código está roto. Acepta números negativos pero no funciona con ellos, y hace suposiciones sobre el tamaño de 'int' – LtWorf
versión Entero es trivial:
int fiGetDigit(const int n, const int k)
{//Get K-th Digit from a Number (zero-based index)
switch(k)
{
case 0:return n%10;
case 1:return n/10%10;
case 2:return n/100%10;
case 3:return n/1000%10;
case 4:return n/10000%10;
case 5:return n/100000%10;
case 6:return n/1000000%10;
case 7:return n/10000000%10;
case 8:return n/100000000%10;
case 9:return n/1000000000%10;
}
return 0;
}
obtener todos los dígitos individuales en algo así como un conjunto - dos variantes:
int i2array_BigEndian(int n, char a[11])
{//storing the most significant digit first
int digits=//obtain the number of digits with 3 or 4 comparisons
n<100000?n<100?n<10?1:2:n<1000?3:n<10000?4:5:n<10000000?n<1000000?6:7:n<100000000?8:n<1000000000?9:10;
a+=digits;//init end pointer
do{*--a=n%10;}while(n/=10);//extract digits
return digits;//return number of digits
}
int i2array_LittleEndian(int n, char a[11])
{//storing the least significant digit first
char *p=&a[0];//init running pointer
do{*p++=n%10;}while(n/=10);//extract digits
return p-a;//return number of digits
}
recursión simple:
#include <iostream>
// 0-based index pos
int getDigit (const long number, int pos)
{
return (pos == 0) ? number % 10 : getDigit (number/10, --pos);
}
int main (void) {
std::cout << getDigit (1234567, 4) << "\n";
}
Brillantemente simple y conciso –
Estas soluciones son todo recursivo o iterativo. ¿Podría un enfoque más directo ser un poco más eficiente?
izquierda a derecha:
int getDigit(int from, int index)
{
return (from/(int)pow(10, floor(log10(from)) - index)) % 10;
}
de derecha a izquierda:
int getDigit(int from, int index)
{
return (from/pow(10, index)) % 10;
}
- 1. ¿Cómo ordenar los dígitos en un número?
- 2. ¿Cómo puedo contar los dígitos en un número entero sin un molde de cuerda?
- 3. Cómo ordenar una colección de objetos en JavaScript sin necesidad de convertirlo en una matriz
- 4. Devolver los 2 últimos dígitos de un número
- 5. convertir un número entero en una matriz
- 6. ¿Cómo obtener el número de columnas en una matriz?
- 7. Conversión de un número de 8 dígitos a DateTime Tipo
- 8. ¿Cómo puedo separar un número y obtener los dos primeros dígitos en PHP?
- 9. ¿Cómo puedo verificar Hamming Weight sin convertirlo en binario?
- 10. Relleno para obtener un número específico de dígitos en un número
- 11. Devuelve los últimos 5 dígitos de un número
- 12. Generar un número aleatorio de N-dígitos
- 13. Cómo mostrar el número en una agrupación de 3 dígitos
- 14. ¿Cómo dividir un número en sus dígitos en Scala
- 15. ¿Agregar un dígito a un int sin convertirlo a una cadena?
- 16. Analizar un número de una cadena con no dígitos entre
- 17. en python ¿cómo convierto un número de un solo dígito en una cadena de dos dígitos?
- 18. ¿Cómo dividir un número en dígitos individuales en C#?
- 19. Cómo generar un número aleatorio de cinco dígitos de Java
- 20. ¿Cuál es una buena manera de eliminar el formato de un número de teléfono para obtener solo los dígitos?
- 21. ¿Hay alguna forma de agregar un número par de dígitos?
- 22. XNA: ¿Obtener una matriz/lista de recursos?
- 23. ¿Cómo puedo insertar un punto decimal antes de los últimos tres dígitos de un número?
- 24. Validación para un número de teléfono de 10 dígitos
- 25. generar un número aleatorio con 7 dígitos
- 26. ¿Cómo se corresponden los dígitos 1101004800 con el número 20?
- 27. ¿Cómo puedo crear una representación de cadena sin relleno de un número en una base arbitraria?
- 28. dividir un carácter de un número con varios dígitos
- 29. SQL que obtiene los dos últimos dígitos del número entero
- 30. ¿Cómo puedo hacer que mi programa haga algo cuando aparece un "número de múltiples dígitos con todos los dígitos idénticos"?
Do u quieren obtener el número de dígitos o todos los dígitos de ese número en las variables independientes o arreglo de enteros ? – vpram86
¿Qué quieres decir? ¿Desea contar la cantidad de dígitos? ¿Desea extraer el 5º dígito de un número? –
¿Puedes dar un ejemplo? –