Autor Tema: Obtener el numero de cifras validas de dato  (Leído 3266 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Obtener el numero de cifras validas de dato
« en: 28 de Diciembre de 2015, 11:16:00 »
Ejemplo

dato=0009...resultado debe ser...1
dato=0025...2
dato=0109...3
dato=4830...4

Tambien me gustaria hacer lo sigiente no se si tendra un nombre matematico yo lo desconozco

dato1=25; dato2=109....resultado debe ser....25109 

Lo que mas me gustaria es un ejemplo de codigo o saber si hay alguna funcion en C que desempeñe esto
mas su correspondiente #libreria pero agradeceria el nombre matematico de ambas para saber que tengo que buscar


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Obtener el numero de cifras validas de dato
« Respuesta #1 en: 28 de Diciembre de 2015, 13:36:22 »
Primer pregunta (suponiendo que todos sean positivos):

int resultado = (dato ==0) ? 0 : (int)Math.log10(dato) + 1;

Segunda preguntar, suponiendo que siempre dato1 sea el que va adelante

int potencia = (dato2 ==0) ? 0 : (int)Math.log10(dato2) + 1;
resultado = dato1*10^resultado + dato2;

La libreria es math.h , o cmath.h si estas en C++

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Obtener el numero de cifras validas de dato
« Respuesta #2 en: 28 de Diciembre de 2015, 21:34:14 »
Todos los datos son prácticamente unsigned. Es CCS  es math.h
Pero no e conseguido nada con esto. A penas salgo del c rudimentario y esto es mucho trabajo
resultado=1
if(dato>9) resultado++; 
else  if(dato>99)  resultado++;
else  if(dato>999)  resultado++;  ....sucesivo puede crear problema de rendimiento

Leere sobre math


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Obtener el numero de cifras validas de dato
« Respuesta #3 en: 28 de Diciembre de 2015, 23:31:19 »
Como estaba en lenguajes de programacion para PC trate de que sea asi... Pero las comparaciones es lo mas rapido que podes tener en un micro.

Código: C
  1. short int cantidad_numeros(int dato){
  2.     if (dato<10) return 1;
  3.     else if (dato<100) return 2;
  4.     else if (dato<1000) return 3;
  5.     else if (dato<10000) return 4;
  6.     return 5;
  7. }

Se usaria:

Código: C
  1. resultado = cantidad_numeros(dato1);

Eso para 16 bits. Dependiendo de los "datos" recibidos, veras si es conveniente que se pregunte primero por los menores o los mayores. Eso depende exclusivamente de los datos que se envien.

Luego para lo otro es valida la formula por igual, solo tenes que sacar la cantidad de numeros que tiene dato2, y multiplicarlo dato1 por 10^(numeros_de_dato2) y luego sumarle dato2.

SINO

Podes pasar el numero a letras, y contar las letras. Lo cual creo que tendrias mas sobrecarga, al menos en la parte de pasar de numeros a letras. mientras que la forma que indico aca tendrias la mayor sobrecarga en la multiplicacion y la potencia.
« Última modificación: 29 de Diciembre de 2015, 04:31:10 por KILLERJC »

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Obtener el numero de cifras validas de dato
« Respuesta #4 en: 29 de Diciembre de 2015, 07:27:03 »
Si lo as planteado mejor pero en mi caso seria mejor:
   100y100=100100
if (resultado>99999) return 6; ///y se acabo porque lo mas habitual es que dato2 valga entre 100 y 650 (dato1 rand(0-200))
else (resultado>9999) return 5;//será cada vec menos probable que pase de aqui
else.....
(lo que yo expuse no es el original y nunca pasa de resutado=2)

respecto a la segunda pregunda e hecho esto directamente:

resultado = 101*10^2+505;//me da 521 No 101505 ¿el orden de operar prioritario de izquierda a derecha esta bien?
¿Qué implica el operador ^?

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Obtener el numero de cifras validas de dato
« Respuesta #5 en: 29 de Diciembre de 2015, 08:44:10 »
Espera debería ser 3
pero esto ((101*10)^3)+505; me da 1514

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re:Obtener el numero de cifras validas de dato
« Respuesta #6 en: 29 de Diciembre de 2015, 09:15:10 »
Primer pregunta (suponiendo que todos sean positivos):

int resultado = (dato ==0) ? 0 : (int)Math.log10(dato) + 1;

Segunda preguntar, suponiendo que siempre dato1 sea el que va adelante

int potencia = (dato2 ==0) ? 0 : (int)Math.log10(dato2) + 1;
resultado = dato1*10^resultado + dato2;

La libreria es math.h , o cmath.h si estas en C++

Muy ingenioso, jamás se me hubiera ocurrido usar el logaritmo ;)

saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Obtener el numero de cifras validas de dato
« Respuesta #7 en: 29 de Diciembre de 2015, 10:57:51 »
Espera debería ser 3
pero esto ((101*10)^3)+505; me da 1514

La formula esta mal, Por que es:

101 * (10^3) + 505 = 101 * 1000 + 505 = 101000 + 505 = 101505


Citar
Muy ingenioso, jamás se me hubiera ocurrido usar el logaritmo

A mi tampoco, fue el primer resultado que salio en google xD, y despues que lo vi me dije... pero que tonto que soy, como no voy a usar el logaritmo

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Obtener el numero de cifras validas de dato
« Respuesta #8 en: 30 de Diciembre de 2015, 09:14:13 »
El xor no me vale

No se si seria mas rápido con <math> pero esto es valido

if (dato1>99){ multiplica=1000; }//Esto es lo mas probable que se cumpla
else { if(dato1>9) { multiplica=100; }
else { multiplica=10; } }

resultado = dato1+(dato2*multiplica);//dto2 concatenacion dato1

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Obtener el numero de cifras validas de dato
« Respuesta #9 en: 30 de Diciembre de 2015, 12:16:49 »
Es mi culpa, siempre utilize el ^ para la potencia para hacerlo como notacion, o al menos crei que te ibas a dar cuenta, con math.h lo haces

resultado = dato1*pow(10,resultado) + dato2;

(dato1 * 10^{resultado} ) + dato2


 

anything