2011-04-04 18 views
17

Duplicar posibles:
long long in C/C++constante entera es demasiado grande para el tipo "larga"

Escribir un programa simple para un problema de Euler proyecto. Se niega a compilar porque "la constante entera es demasiado grande para" largo "tipo", aunque debería estar dentro de los límites de tamaño de largo sin firmar. Usando el compilador dev-C++.

código

en cuestión:

#include <iostream> 

bool isprime (unsigned long long i) 
{ 
    if(i==1||i==0) return false; 
    if(i==2) return true; 
    for(unsigned long long k=2;k!=i-1;k++) 
    {  
     if(i%k==0) return false; 
    } 
    return true; 
} 

int main() 
{ 
    for(unsigned long long i=600851475143;i>=0;i--) //problematic line 
    { 
     if(isprime(i)) 
     { 
      std::cout<<i; 
      std::cin.get(); 
      return 0; 
     } 
    } 
} 
+1

Posible duplicado de: http://stackoverflow.com/questions/1458923/long-long-in-cc –

+0

Parece http://projecteuler.net/problem=3 :-) Encontré esta respuesta mientras trataba de resolver lo mismo :-) –

Respuesta

25

probar un sufijo "ULL": 600851475143ULL

+3

Mejor, intente 'ULL', es' unsigned long long'. – Xeo

+0

@Xeo: Correcto. Hecho. –

+0

¿Qué sabes? Funciona. Me había olvidado de los sufijos. – Bacu

0

debe ser una limitación de apoyo Dev-C++ para largo tiempo tipo de datos. Compila bien en MS VC++ 2010.

+3

Eso sería un error en MS VC++ 2010, a menos que su tipo nativo 'int' sea de 64 bits. El literal como tipeado es un 'int'. –

+0

No quiero entrar en una discusión larga sobre esto, pero siempre he entendido que un buen compilador debe elegir el tipo de datos más apropiado para la representación interna de literales que no lo especifican explícitamente. En este caso, el valor puede almacenarse en ** long long **, pero parece que el copmpiler elige usar ** long ** antes incluso de mirar el valor real o el destino de la tarea. No soy un gran admirador de la EM en general, pero su forma me parece "mejor" en este caso. – FumbleFingers

+0

ps - Sé que la definición formal para C++ dice que los literales numéricos se almacenan en cualquier cosa que el compilador use como su tipo nativo ** int **. Pero no llamaría a la aproximación de MS un * error * - es más una * extensión no estándar * para mí. – FumbleFingers

3

Su literal como mecanografiado tiene el tipo int que no es lo suficientemente grande como para mantener el valor. Pruebe 600851475143ULL como primer arreglo.

Observe que incluso con eso, su bucle for nunca terminará, ya que un unsigned nunca puede ser menor que 0. En su lugar, use un long long y 600851475143LL.

Cuestiones relacionadas