elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema en variable int
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Problema en variable int  (Leído 8,150 veces)
meoit ARG

Desconectado Desconectado

Mensajes: 6


Que manzana se le callo a newton en la cabeza!


Ver Perfil WWW
Problema en variable int
« en: 28 Abril 2014, 21:56 pm »

Hola gente :)

mi problema es que tengo una variable llamada numero, que su valor es dado por el usuario, y con ese numero trabaja el programa que estoy haciendo

Código
  1. if ((numero > 99999999999999999999) && (numero < 10000000000000000)) //si numero tiene 21 caracteres
  2. {
  3. }

el problema es que  99999999999999999999 es un valor que execede la capacidad de bits de la variable int, pero la cambio a long double y sigue ese error...

Espero que me hayan entendido

Salu2 meoit =)


En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Problema en variable int
« Respuesta #1 en: 28 Abril 2014, 22:02 pm »

18446744073709551615   <= unsigned long long int  :laugh:
99999999999999999999
pues ni idea amigo jajaj me has vencido hasta a mi XDD


« Última modificación: 28 Abril 2014, 22:04 pm por vangodp » En línea

xv0


Desconectado Desconectado

Mensajes: 1.027



Ver Perfil
Re: Problema en variable int
« Respuesta #2 en: 28 Abril 2014, 22:18 pm »

Es un numero de 64 bits "quad", prueba con un long long int.

Un saludo.
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema en variable int
« Respuesta #3 en: 28 Abril 2014, 23:06 pm »

Hola gente :)
.................................

Código
  1. if ((numero > 99999999999999999999) && (numero < 10000000000000000)) //si numero tiene 21 caracteres
  2. {
  3. }

............................................

Salu2 meoit =)

Antes que nada revisa esas condiciones ya que no puede ser a la vez:

Código
  1. numero>99999999999999999999  y
  2. numero<10000000000000000

¡¡¡¡ Saluditos! ..... !!!!


En línea

meoit ARG

Desconectado Desconectado

Mensajes: 6


Que manzana se le callo a newton en la cabeza!


Ver Perfil WWW
Re: Problema en variable int
« Respuesta #4 en: 29 Abril 2014, 03:15 am »

Antes que nada mil gracias por sus respuestas a todos.
 Cpu2 cuando este en mi ordenador lo probaré
Loesansan: estaba trabajando con el codigo, no llegue a editar esa condicion porque la primera me tiraba error, igual se entiende mi problema xD
Vangodp: jajaja ya somos dos :DD
En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Problema en variable int
« Respuesta #5 en: 29 Abril 2014, 09:18 am »

Bueno compañero, por donde busques eso es tema de silencio jeje secretismo XDDD
Solo opinan los gatos como yo ¿pero que vamos hacer? Venga vamos allá =D
A noche investigando por internet he encontrado 2 soluciones.
Una es que añadas librerías externas y otra que lo reinventes vos la rueda ><
Pues en vez de guardar números en enteros que los guardes en strings luego a la hora de sumar te quemas el coco haciendo como si lo hiciera en papel, por ejemplo si tienes un numero: XD
091278q358172345324785983247572340985723477239047592389045
pues lo guardas en string

string n = "091278q358172345324785983247572340985723477239047592389045";

hasta aquí no has reinventado nada XDD
venga vamos a ver como lo hacemos...
si tenemos 2 cadenas de numeros
091278q358172345324785983247572340985723477239047592389045
091278q358172345324785983247572340985723477239047592389045

como se sumaria eso en papel???

empezariamos por el ultimo numero 5 ¿verdad?...¡No te la voy hacer hombre! Eso lo haces tu XDD

pues bien... "cualquier operación que realicemos en papel se puede realizar en las tablas", lo pongo entre "" por que la frase no es mía XDD

La cosa seria sumar el 5 de arriba que seria el ultimo numero de una tabla con el siguiente que es otra tabla.
Los tomas como string o como una tabla fija de números al que declaras antes, o puedes hacer uso del heap ;)
si sumas por ejemplo 6 + 6 ya ves que tenemos un problema y es que da 12, ese 1 tienes que sumar a la casilla previa. Pero no todo el monte es orgasmo, las funciones de comparación las tendrías que hacer tu también, al igual que la de resta y las demás operaciones, también lo tendrías que hacer para los flotantes en caso de necesitar. Acabarías por escribir una librería completa XDDD

Una solución también seria usar notación científica para encoger esos números pero seria lo mismo por que hay símbolos y no los puedes meter en un entero. =(

Bueno...no tenemos por que reinventar la rueda.
He encontrado 2 librerías que hacen eso.Pero debo de señalar que desconozco ambas, por que nunca use esos números tan largos, simplemente es un tema que me interesa por si las moscas un dia....

Bien segun "he leido" y encontre :
http://www.ginac.de/CLN/cln.html
https://mattmccutchen.net/bigint/index.html

la primera la encontre en un tema que esta aqui: http://clan-destino42.blogspot.com.es/2011/01/numeros-grandes-en-c.html

Según el bloguero la CLN trabaja el y puede usar numeros de 300 caracteres.
La otra me parece que puede con 200 caracteres.

Pero la cosa no son la cantidad de caracteres sino la cantidad de funciones que tenga dicha librería, cosas como comparar, restar o lo que sea y si posible no nos cambia la forma de trabajar que tenemos pues seria genial :D

Ahora toca buscar a ver si valen para algo =D
Lo siento no poder ayudar mas, pero no soy ni científico friky XDD ni un programador avanzado, puede que aya mejores opciones por Internet y solo hay que investigar un poco mas.
Es que no es muy normal que digamos usar esos tipos de números en programación normal y corriente, por eso pocos contestan.

Suerte!

Si encuentras algo mejor comparte aquí que también me interesa saber algo =D  ;-)




En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema en variable int
« Respuesta #6 en: 29 Abril 2014, 10:14 am »

¿Y hacerte una clase para manejar números grandes?

También puedes aprovechar alguna clase ya existente en internet para realizar esta tarea.

Si estás programando en C el tema de las clases ya no te sirve... pero aún así sigue habiendo opciones.
En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Problema en variable int
« Respuesta #7 en: 29 Abril 2014, 11:23 am »

po funciones ¿eso es lo que puedes aportar al tema? Señalar los fallos? Si no lo sabe un programador como tu nada que ayude estamos perdidos :silbar:
 :laugh:
« Última modificación: 29 Abril 2014, 11:25 am por vangodp » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Problema en variable int
« Respuesta #8 en: 29 Abril 2014, 11:41 am »

Código
  1. #include <bitset>
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5.  
  6. class BigNum
  7. {
  8.  public:
  9.  
  10.    BigNum( int number = 0 );
  11.  
  12.    BigNum( const std::string& number );
  13.  
  14.    BigNum operator+( const BigNum& number );
  15.  
  16.    std::string ToBinString( ) const;
  17.  
  18.    std::string ToString( ) const;
  19.  
  20.  private:
  21.  
  22.    bool _negative;
  23.    std::vector< unsigned int > _number;
  24.  
  25.    void Mul10AddN( unsigned int number );
  26.  
  27.    std::string Mul2( const std::string& number ) const;
  28.  
  29.    std::string Mul2AddN( const std::string& number, int carry ) const;
  30.  
  31.    void FromString( const std::string& number );
  32. };
  33.  
  34. BigNum::BigNum( int number )
  35.  : _negative( false )
  36. {
  37.  if ( number < 0 )
  38.  {
  39.    _negative = true;
  40.    number = -number;
  41.  }
  42.  else if ( number > 0 )
  43.    _number.push_back( number );
  44. }
  45.  
  46. BigNum::BigNum( const std::string& number )
  47. {
  48.  FromString( number );
  49. }
  50.  
  51. BigNum BigNum::operator +( const BigNum& number )
  52. {
  53. //  if ( number1._negative != number2._negative )
  54. //  {
  55. //    if ( number1._negative )
  56. //    {
  57. //      BigNum temp = number1;
  58. //      temp._negative = false;
  59. //      return number2 - temp;
  60. //    }
  61. //    else
  62. //    {
  63. //      BigNum temp = number2;
  64. //      temp._negative = false;
  65. //      return number1 - temp;
  66. //    }
  67. //  }
  68.  
  69.  BigNum to_return;
  70.  to_return._negative = _negative;
  71.  
  72.  unsigned int carry = 0;
  73.  unsigned int max = (_number.size( ) > number._number.size( ) )? _number.size( )
  74.                                                                : number._number.size( );
  75.  
  76.  for ( unsigned int i=0; i < max; i++ )
  77.  {
  78.    unsigned long long temp = 0;
  79.  
  80.    if ( i < _number.size( ) )
  81.      temp = static_cast< unsigned long long >( _number[ i ] );
  82.  
  83.    if ( i < number._number.size( ) )
  84.      temp += static_cast< unsigned long long >( number._number[ i ] );
  85.  
  86.    temp += carry;
  87.  
  88.    to_return._number.push_back( static_cast< unsigned int >(temp & 0xFFFFFFFF) );
  89.    carry = static_cast< unsigned int >(temp >> 32);
  90.  }
  91.  
  92.  if ( carry != 0 )
  93.    to_return._number.push_back( static_cast< unsigned int >( carry ) );
  94.  
  95.  return to_return;
  96. }
  97.  
  98. std::string BigNum::ToBinString( ) const
  99. {
  100.  std::string to_return;
  101.  
  102.  for ( unsigned int i=_number.size( ) - 1; i < _number.size( ); i-- )
  103.  {
  104.    std::bitset< 32 > bits( static_cast< int >( _number[ i ] ) );
  105.    to_return += bits.to_string( );
  106.  }
  107.  
  108.  while ( to_return[ 0 ] == '0' )
  109.    to_return.erase( to_return.begin( ) );
  110.  
  111.  int i = static_cast< int >( to_return.size( ) ) - 4;
  112.  while ( i > 0 )
  113.  {
  114.    to_return.insert( i, 1, ' ' );
  115.    i -= 4;
  116.  }
  117.  return to_return;
  118. }
  119.  
  120. std::string BigNum::ToString() const
  121. {
  122.  std::string to_return = "0";
  123.  
  124.  for ( auto it = _number.rbegin( ); it != _number.rend( ); ++it )
  125.  {
  126.    int data = *it;
  127.    for ( int i=0; i< 32; i++ )
  128.    {
  129.      to_return = Mul2AddN( to_return, (data & 0x80000000)? 1 : 0 );
  130.      data <<= 1;
  131.    }
  132.  }
  133.  
  134.  return to_return;
  135. }
  136.  
  137. void BigNum::Mul10AddN(unsigned int number)
  138. {
  139.  if ( _number.empty( ) )
  140.  {
  141.    _number.push_back( number );
  142.    return;
  143.  }
  144.  
  145.  unsigned long long carry = static_cast< unsigned long long >( number );
  146.  unsigned long long ten = 10;
  147.  for ( unsigned int i = 0; i < _number.size( ); i++ )
  148.  {
  149.    unsigned long long temp = static_cast< unsigned long long >( _number[ i ] ) * ten + carry;
  150.  
  151.    _number[ i ] = static_cast < unsigned int >( temp & 0xFFFFFFFF);
  152.    carry = ( temp >> 32 );
  153.  }
  154.  
  155.  if ( carry != 0 )
  156.    _number.push_back( static_cast< unsigned int >( carry ) );
  157. }
  158.  
  159. std::string BigNum::Mul2AddN(const std::string& number, int carry ) const
  160. {
  161.  std::string to_return;
  162.  
  163.  for ( auto it = number.rbegin( ); it != number.rend( ); ++it )
  164.  {
  165.    int temp = (*it - '0') * 2 + carry;
  166.  
  167.    if ( temp >= 10 )
  168.    {
  169.      temp -= 10;
  170.      carry = 1;
  171.    }
  172.    else
  173.      carry = 0;
  174.  
  175.    to_return.insert( 0, 1, temp + '0' );
  176.  }
  177.  
  178.  if ( carry != 0 )
  179.    to_return.insert( 0, 1, carry + '0' );
  180.  
  181.  return to_return;
  182. }
  183.  
  184. void BigNum::FromString(const std::string& number)
  185. {
  186.  unsigned int i=0;
  187.  if ( number[ i ] == '-' )
  188.  {
  189.    _negative = true;
  190.    i++;
  191.  }
  192.  else
  193.    _negative = false;
  194.  
  195.  _number.clear( );
  196.  
  197.  for ( ; i < number.length( ); i++ )
  198.  {
  199.    unsigned int digit = number[ i ] - 0x30;
  200.    Mul10AddN( digit );
  201.  }
  202. }
  203.  
  204. int main( )
  205. {
  206.  BigNum a( 100 );
  207.  BigNum b( "9000000000000" );
  208.  
  209.  BigNum c = a + b;
  210.  
  211.  std::cout << a.ToString( ) << std::endl
  212.            << "+" << std::endl
  213.            << b.ToString( ) << std::endl
  214.            << "=" << std::endl
  215.            << c.ToString( ) << std::endl;
  216.  
  217.  a = BigNum( "123456123456123456123456123456123123" );
  218.  b = BigNum( "876543211234567876543212345678");
  219.  c = a + b;
  220.  
  221.  
  222.  std::cout << a.ToString( ) << std::endl
  223.            << "+" << std::endl
  224.            << b.ToString( ) << std::endl
  225.            << "=" << std::endl
  226.            << c.ToString( ) << std::endl;
  227. }
  228.  

Como es de esperar... ni está optimizada ni completa... está hecha en un rato para satisfacer el insaciable apetito de vangodp... pero vale de ejemplo.

actualizado: Ahora también imprime el string en base 10.
« Última modificación: 29 Abril 2014, 13:41 pm por eferion » En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Problema en variable int
« Respuesta #9 en: 29 Abril 2014, 14:10 pm »

no me equivocaba jeje Si no lo sabes tu quien va saberlo ^^
Ahora me falta un mes para analizar el código  :laugh:
En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con variable
Scripting
kraszic 6 4,177 Último mensaje 2 Agosto 2008, 00:42 am
por kraszic
Problema variable j
Programación C/C++
Ander123 6 2,882 Último mensaje 28 Octubre 2012, 12:57 pm
por DickGumshoe
Problema con variable de sesion y variable de conexion
PHP
Vaagish 9 6,358 Último mensaje 19 Marzo 2013, 22:37 pm
por Vaagish
MOVIDO: Asignar un valor a una variable(ScriptA)Obtener esa variable (ScriptB)-UNITY c#
Scripting
Eleкtro 0 2,917 Último mensaje 8 Octubre 2013, 17:49 pm
por Eleкtro
PROBLEMA CON UNA VARIABLE
Programación C/C++
magv1991 2 1,950 Último mensaje 21 Febrero 2014, 14:19 pm
por NikNitro!
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines