代码之家  ›  专栏  ›  技术社区  ›  priyanka.sarkar

处理C中的“大”整数#

  •  6
  • priyanka.sarkar  · 技术社区  · 16 年前

    如何处理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库中删除!

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

    7 回复  |  直到 16 年前
        1
  •  27
  •   Evan    16 年前

    如果你只看最后四位数,你不需要任何大于整数的东西。考虑一下:

    当两个数字相乘时,如果您只对最低有效数字(即最后四个数字)感兴趣,则 最上面的数字无效 在结果的最低位数上…所以你可以 扔掉 “最重要(右侧)数字 在你繁殖之前 .

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

    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(后两位数字仍为“ 六十九 “但是我们 没有溢出 )

    我用了这个方法 计算 Six Right-Most Digits of 1,000,000 factorial .

    享受,

    罗伯特·C·卡塔诺

        2
  •  7
  •   Thomas Levesque    16 年前
        4
  •  1
  •   Dmitry Risenberg    16 年前

    你可以这样修改你的代码:

        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,为什么要将产品作为参数传递?

        5
  •  0
  •   Mark Carpenter    16 年前

    试着用double或long代替int来表示产品怎么样?它只在某些情况下起作用,但是它可以让你处理更多你能处理的数字。

        6
  •  0
  •   MaLKaV_eS    16 年前

    我希望我没有理解错,但是如果结果为0,您想在控制台“0000”中写入内容吗? 你试过了吗?

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

    ?

    如果你想要的是把0000作为一个整数,我很抱歉,但不知道如何得到它。

        7
  •  0
  •   JP Alioto    16 年前

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