在C#中处理“大”整数

时间:2009-06-06 15:26:47

标签: 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;
    }

调用函数为GetDivisorProduct(N, 1)

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

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

已从C#库中删除BigInteger类!

如何获取最后四位数?

7 个答案:

答案 0 :(得分:27)

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

当乘以两个数字时,如果您只对最低有效数字(即最后四位数字)感兴趣,那么最高位数对结果的最低位数没有影响 ...所以你可以在乘法之前“抛出”最重要的(右侧)数字

例如:我想要乘以两个大数字,但我只需要最后两位数字:

int num1 = 123456789;
int num2 = 987654321;

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

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

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

89 * 21 = 1869(最后两位仍然是“ 69 ”但我们没有溢出)。

我使用此技术来计算Six Right-Most Digits of 1,000,000 factorial

享受,

Robert C. Cartaino

答案 1 :(得分:7)

.NET 4.0有一个BigInteger

答案 2 :(得分:1)

答案 3 :(得分:1)

好吧,您可以像这样修改代码:

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

这是因为(10000 * k + 1) R的后四位数与l R相同。实际的产品类型取决于您想要处理的N的范围。如果它都是整数类型,则产品应该很长。

顺便说一下,为什么将产品作为参数传递,如果它总是1?

答案 4 :(得分:0)

尝试使用double或long而不是int作为产品怎么样?它只会在某些情况下起作用,但它可以让你使用你已经能够使用的更大数字。

答案 5 :(得分:0)

我希望我没有理解,但如果结果为0,你想在Console“0000”中写入? 你试过了吗?

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

如果你想要的是将数字0000作为int我很抱歉,但不知道如何获得它。

答案 6 :(得分:0)

如果您现在不能使用.NET 4.0,可以使用C#中的J#库中的BigInteger。 Here's an article describing how。它会影响部署,因为您需要部署J# re-distributable