在C#中处理“大”整数

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

如何获取最后四位数字?


请参考相关问题: https://dev59.com/H0fSa4cB1Zd3GeqPA-WX - sourcenouveau
3
你的意思是看到相同的问题吗? - heavyd
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阶乘的右六个非零位数字


7
是的。模算术:(a * b)%m ==((a%m)*(b%m))%m - Mehrdad Afshari
这是一个更为简洁的方式来解释我冗长的示例 <微笑>。 - Robert Cartaino

7

太好了 - 我不知道有 BigInteger 类! - TWith2Sugars
2
OP不应该使用BigInteger。请参考Robert的回答。 - Mehrdad Afshari

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的最后四位数字与lR的相同。实际产品类型取决于您想要处理的N范围。如果它是所有整数类型,则产品应该是长整型。

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


1

谢谢,我之前也见过这个问题。请提供相应的代码解决方案。 - priyanka.sarkar

0
怎么样尝试使用 double 或 long 替代 int 来处理 product?虽然这只适用于某些情况,但它能让你处理更大的数字。

我已经尝试使用double、long等数据类型,但结果相同。 - priyanka.sarkar
抱歉我无法提供更多帮助!祝你好运! - Mark Carpenter

0

我希望我没有理解错,但是你想在控制台中如果结果为0,则输出“0000”吗? 你试过这样吗:

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

?

如果你想把0000转换成整数,很抱歉,我不知道该怎么做。


我已经这样做了,但这绝不是可行的解决方案。你认为呢? - priyanka.sarkar

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接