Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: lluk en 8 Mayo 2011, 14:52 pm



Título: Entero de 10 elevado a 1000
Publicado por: lluk en 8 Mayo 2011, 14:52 pm
Hola, estoy haciendo un problema que necesito un entero tal que:

n< 10 a la 6
y otro tal que
n< 10 a la 1000

me podéis decir que tipo tendría que usar?
con el long long no me entra

gracias de antemano

EDITO: encontré otra forma de hacer el programa, pueden cerrar el post


Título: Re: Entero de 10 elevado a 1000
Publicado por: lluk en 8 Mayo 2011, 15:47 pm
para no abrir tema nuevo,
saben como puedo hacer para escribir por ejemplo:
100000000
y que cada numero se guarde en un a posicion de un arreglo distinta?


Título: Re: Entero de 10 elevado a 1000
Publicado por: Akai en 8 Mayo 2011, 17:49 pm
Creo que primero necesitas aprender sobre numeración en el ordenador.

Con enteros NO te va a entrar, usa floats (doubles si eso)

Con un long, suponiendo que el int es de 32, el long es de 64, lo que da 2^63 (a la 64 si es unsigned), que es mucho menor que 10^63, ya ni te digo 10^1000

Para tu segunda duda, hay mil formas, una de ellas utilizar sprintf para imprimir el número a una cadena de carácteres,


Título: Re: Entero de 10 elevado a 1000
Publicado por: pucheto en 8 Mayo 2011, 17:52 pm
O puede usar strings para representar los enteros ( e implementar todas las op basicas )... double pierde precision a lo tonto en numeros grandes... y en una de esas busca precision numerica...


Título: Re: Entero de 10 elevado a 1000
Publicado por: ghastlyX en 8 Mayo 2011, 20:15 pm
Más que strings, para programar BigInts la práctica más extendida es usar vectores de enteros, de forma que en cada posición no se guarda un único dígito, sino varios de ellos, permitiendo aprovechar las operaciones de las variables nativas del lenguaje y además haciendo el cálculo de forma mucho más eficiente.

He picado un ejemplo para poder hacer potencias. No lo he testeado así que quizá tenga algún bug, pero la idea en sí creo que se entiende con el código.
Código
  1. #include <iostream>
  2. #include <vector>
  3. #include <sstream>
  4. #include <iomanip>
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8. typedef vector<ll> VL;
  9.  
  10. const ll base = 1000000000;
  11.  
  12. class BigInt {
  13.    public:
  14.        VL v;
  15.        int signo;
  16.  
  17.        BigInt() {
  18.            v = VL(1, 0);
  19.            signo = 1;
  20.        }
  21.        BigInt(ll x) {
  22.            do {
  23.                v.push_back(x%base);
  24.                x /= base;
  25.            } while (x > 0);
  26.            signo = 1;
  27.        }
  28.        void operator*=(const BigInt& b) {
  29.            BigInt c;
  30.            c.v.resize(v.size() + b.v.size(), 0);
  31.            c.signo = signo*b.signo;
  32.            for (int i = 0; i < v.size(); ++i) {
  33.                for (int j = 0; j < b.v.size(); ++j) {
  34.                    int k = i + j;
  35.                    c.v[k] += v[i]*b.v[j];
  36.                    while (c.v[k] >= base) {
  37.                        c.v[k + 1] += c.v[k]/base;
  38.                        c.v[k++] %= base;
  39.                    }
  40.                }
  41.            }
  42.            int i;
  43.            for (i = c.v.size() - 1; i > 0 and c.v[i] == 0; --i);
  44.            c.v.resize(i + 1);
  45.            *this = c;
  46.        }
  47.        BigInt pow(ll k) {
  48.            if (k == 0) return BigInt(1);
  49.            BigInt res = this->pow(k >> 1);
  50.            res *= res;
  51.            if (k&1) res *= (*this);
  52.            return res;
  53.        }
  54.        friend ostream &operator<<(ostream &out, BigInt &b) {
  55.            if (b.signo < 0) out << '-';
  56.            int i = b.v.size() - 1;
  57.            out << b.v[i];
  58.            for (--i; i >= 0; --i) out << setw(9) << setfill('0') << b.v[i];
  59.            return out;
  60.        }
  61. };
  62.  
  63. int main() {
  64.    BigInt x(10);
  65.    x = x.pow(1000);
  66.    cout << x << endl;
  67. }
  68.