在C#中处理"大"整数

pri*_*kar 6 c# overflow biginteger modulo

如何处理C#中的大整数?

我有一个函数,它会给我除数的乘积:

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;
    }
Run Code Online (Sandbox Code Playgroud)

调用函数是 GetDivisorProduct(N, 1)

如果结果大于4位,我应该只获得最后4位数.(例如,如果我输入957,则仅在修剪掉最后四个值后输出为7493.实际结果为876467493.).

其他样本输入:如果我给10000,则输出为0.

BigInteger类别已经从C#库中删除!

我怎样才能得到最后四位数字?

Rob*_*ino 27

如果您只查看最后四位数,则不需要任何大于整数的数字.考虑一下:

当两个数相乘,如果你只在最显著位(即最后四位数字)感兴趣的话,那么最上面的数字将不会有效果对结果的最低位...所以你可以只是" 扔出去 " 乘以之前的最重要(右侧)数字.

例如:我想将两个大数相乘但我只需要最后两位数:

int num1 = 123456789;
int num2 = 987654321;

int result = num1 * num2; // Last two digits would be "69" but this OVERFLOWS
Run Code Online (Sandbox Code Playgroud)

但如果我们只乘以最后两位数......

int result = (num1 % 100) * (num2 % 100);  // result = 89 * 21
Run Code Online (Sandbox Code Playgroud)

89*21 = 1869(最后两位仍为" 69 ",但我们没有溢出).

我使用这种技术来计算1,000,000阶乘六个最右边的数字.

请享用,

Robert C. Cartaino

  • 是的.模数运算:(a*b)%m ==((a%m)*(b%m))%m (7认同)

Tho*_*que 7

.NET 4.0有一个BigInteger

  • OP根本不应该使用BigInteger.见罗伯特的回答. (2认同)