如何处理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
类!
如何获取最后四位数?
答案 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)
答案 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。