Pergunta

Como faço para lidar com grandes números inteiros em C #?

Eu tenho uma função que vai me dar o produto de divisores:

private static int GetDivisorProduct(int N, int product)
    {
        for (int i = 1; i < N; i++)
        {
            if (N % i == 0)
            {
                Console.WriteLine(i.ToString());
                product *= i;
            }
        }

        return product;
    }

A função de chamada é GetDivisorProduct(N, 1)

Se o resultado for maior do que 4 dígitos, eu deveria obter apenas os últimos 4 dígitos. (Por exemplo Se eu der uma entrada de 957, a saída é 7493 após o corte para fora apenas os últimos quatro valores. O resultado real é 876467493.).

Outras entradas de exemplo:. Se eu der 10000, a saída é 0

A classe BigInteger foi removido da biblioteca C #!

Como posso obter os últimos quatro dígitos?

Foi útil?

Solução

Se você está olhando apenas para os últimos quatro dígitos, você não precisa de qualquer coisa maior que um inteiro. Considere o seguinte:

Ao multiplicar dois números, se você está interessado apenas nas dígitos menos significativos (ou seja, os quatro últimos dígitos), então as superior a maioria dos dígitos não terá um efeito em mais dígitos do resultado ... assim você pode apenas " jogar fora " os dígitos mais significativos (lado direito) antes de multiplicar .

Por exemplo: eu quero multiplicar dois números grandes, mas eu só preciso os últimos dois dígitos:

int num1 = 123456789;
int num2 = 987654321;

int result = num1 * num2; // Last two digits would be "69" but this OVERFLOWS

mas se multiplicam única os últimos dois dígitos ...

int result = (num1 % 100) * (num2 % 100);  // result = 89 * 21

89 * 21 = 1869 (os dois últimos dígitos são ainda " 69 " mas nós ainda não transbordada ).

eu usei esta técnica para calcular o Seis mais à direita dígitos de 1.000.000 fatorial.

Outras dicas

Bem, você pode modificar seu código como este:

    for (int i = 1; i < N; i++)
    {
        if (N % i == 0)
        {
            Console.WriteLine(i.ToString());
            product *= i;
        }
        if (product > 10000 * N)
        {
            product %= 10000;
        }
    }

Isso ocorre porque os quatro últimos dígitos do (10000 * k + l) R são os mesmos que para l R. O tipo real de produto depende da gama de N é você deseja manipular. Se tudo é tipo inteiro, em seguida, o produto deve ser longo.

A propósito, por que você passa produto como um parâmetro, se é sempre 1?

Que tal tentar usar um casal ou longo em vez de int para o produto? Ele só iria funcionar em alguns casos, mas seria permitem que você trabalhe com um número maior de que você foi capaz de fazer.

Espero não fez missunderstood, mas você quer escrever no Console "0000" se o resultado é 0? Você já tentou:

Console.WriteLine(i.ToString().PadLeft(4,"0")); 

?

Se o que você quer é obter o número 0000 como um int Sinto muito, mas não sei como obtê-lo.

Se você não pode ir para .NET 4.0 agora, você pode usar BigInteger do # biblioteca J de C #. Aqui está um artigo descrevendo como . Ele faz implantação impacto que você precisa para implantar o J # re-distribuível .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top