7

如何在 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。

该类BigInteger已从 C# 库中删除!

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

4

7 回答 7

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 ”但我们没有溢出)。

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

于 2009-06-06T16:13:57.723 回答
7

.NET 4.0有一个BigInteger

于 2009-06-06T15:42:52.970 回答
1

http://www.codeproject.com/csharp/BigInteger.asp

于 2009-06-06T15:31:36.860 回答
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 + l) R 的最后四位数字与 l R 的相同。产品的实际类型取决于您要处理的 N 的范围。如果都是整数类型,那么产品应该是长的。

顺便说一句,如果产品始终为1,为什么要将产品作为参数传递?

于 2009-06-06T15:58:59.810 回答
0

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

于 2009-06-06T15:29:17.207 回答
0

我希望我没有误解,但是如果结果为0,你想在控制台中写“0000”吗?你有没有尝试过:

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

?

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

于 2009-06-06T15:43:28.323 回答
0

如果您现在无法转至 .NET 4.0,则可以使用 C# 中 J# 库中的 BigInteger。 这是一篇描述如何. 它确实会影响部署,因为您需要部署J# re-distributable

于 2009-06-06T17:37:44.623 回答