【问题标题】:Handling "Big" Integers in C#在 C# 中处理“大”整数
【发布时间】:2010-10-31 21:20:15
【问题描述】:

如何在 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# 库中删除!

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

【问题讨论】:

标签: c# overflow biginteger modulo


【解决方案1】:

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

【讨论】:

  • 我已经尝试过 double、long 等。结果相同。
  • 对不起,我帮不上忙!祝你好运!
【解决方案2】:

【讨论】:

  • 谢谢..即使我以前也见过。请给出相同代码的解决方案。
【解决方案3】:

.NET 4.0 有一个 BigInteger 类

【讨论】:

  • Sweet - 不知道 BigInteger 类!
  • OP 根本不应该使用 BigInteger。请参阅罗伯特的回答。
【解决方案4】:

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

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

?

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

【讨论】:

  • 我已经这样做了..但这根本不是可行的解决方案。你认为是真的吗?
【解决方案5】:

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

    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 的最后四位数字与 lR 的相同。产品的实际类型取决于您要处理的 N 的范围。如果都是整数类型,那么product应该是long。

顺便问一下,如果product一直是1,为什么还要把product作为参数传递呢?

【讨论】:

    【解决方案6】:

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

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

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

    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。

    【讨论】:

    • 是的。模运算:(a * b) % m == ((a % m) * (b % m)) % m
    • 这是一个更简洁的方式来解释我冗长的例子 .
    【解决方案7】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2020-11-19
      • 2015-11-14
      • 2012-05-27
      • 2015-06-24
      • 2012-03-03
      • 2010-09-12
      相关资源
      最近更新 更多