有效地将大的 BigInteger 转换为字符串,ToString() 耗时太长

奥默·埃内斯

我正在研究一个阶乘函数,大整数的阶乘会变得非常长。

比如20万!= 973350 位长,如果我只使用 ToString(),事情需要很长时间。

20万!转换为字符串需要更长的时间然后实际计算它!

我尝试将阶乘函数设置为进程,然后使用ProcessorAffinity将线程固定到特定核心,以便该核心仅转换为字符串,但这只是花费了完全相同的时间。

另外,我想将其转换为字符串的原因是因为我想将输出 (FactFile) 写入文本文件。

字符串转换代码:

using (Process proc = Process.GetCurrentProcess())
{
     proc.ProcessorAffinity = (IntPtr)0x0003;
     FactFile = Res.ToString(); //FactFile is Going to be the final string, Res is the Factorial.
}

这是我的因子代码:

for (BigInteger i = 1; i < k; i++)
{
    Res *= i; // Res is the number to Calculate the factorial of
}

20万!计算需要 15 秒,然后再用 18 秒将其转换为字符串(这可能因 cpu 到 cpu 不同,我有一个 i7)。

提醒:转换为字符串的最有效方法是什么?

输出:

Total Computation Time: 00:00:16.2007276
String Conversion Time: 00:00:19.4049292
西奥多·祖利亚斯

这是一个快 40% 的字符串化器。它将大整数与数字 10^10000 反复相除,对余数进行字符串化,最后将所有字符串连接在一起。它也可以处理负数。

public static string ToDecimalString(this BigInteger value)
{
    if (value == 0) return "0";
    var digits = 10000;
    var divider = BigInteger.Pow(10, digits);
    var parts = new Stack<string>();
    while (true)
    {
        BigInteger remainder;
        value = BigInteger.DivRem(value, divider, out remainder);
        if (value != 0)
        {
            parts.Push(BigInteger.Abs(remainder).ToString().PadLeft(digits, '0'));
        }
        else
        {
            parts.Push(remainder.ToString());
            break;
        }
    }
    return String.Join("", parts);
}

通过将剩余部分的字符串化卸载到后台线程,它可以变得稍微快一些。不幸的是,算法中最慢的部分(对 的调用BigInteger.DivRem)是不可并行化的。

public static string ToDecimalStringParallel(this BigInteger value)
{
    if (value == 0) return "0";
    var digits = 10000;
    var divider = BigInteger.Pow(10, digits);
    var remainders = new BlockingCollection<BigInteger>();
    var parts = new ConcurrentStack<string>();
    var task = Task.Run(() =>
    {
        foreach (var remainder in remainders.GetConsumingEnumerable())
        {
            parts.Push(BigInteger.Abs(remainder).ToString().PadLeft(digits, '0'));
        }
    });
    while (true)
    {
        BigInteger remainder;
        value = BigInteger.DivRem(value, divider, out remainder);
        if (value != 0)
        {
            remainders.Add(remainder);
        }
        else
        {
            remainders.CompleteAdding();
            task.Wait();
            parts.Push(remainder.ToString());
            break;
        }
    }
    return String.Join("", parts);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将Biginteger转换为字符串

来自分类Dev

将字符转换为BigInteger

来自分类Dev

将BigInteger转换为二进制字符串

来自分类Dev

如何将BigInteger转换为科学记数字符串并返回?

来自分类Dev

将十六进制字符串转换为其等效的BigInteger会使值取反

来自分类Dev

C#:BigInteger转换为具有指定基数的字符串

来自分类Dev

如何最有效地将特定字节从二进制文件转换为字符串

来自分类Dev

有效地将空字符串替换为数组中的null

来自分类Dev

有效地将空字符串替换为数组中的null

来自分类Dev

如何将解密的 BigInteger 转换回字符串?

来自分类Dev

如何有效地从大txt文件中仅读取字符串

来自分类Dev

SQL 查询耗时太长 - 具有相同 ID 的多个 AND

来自分类Dev

Java的BigInteger toString方法不返回大整数的(非空)字符串

来自分类Dev

将 InputStream 转换为 BigInteger

来自分类Dev

将 double 转换为 BigInteger

来自分类Dev

有效地将布尔数组更改为字符串-Swift

来自分类Dev

有效地将多维数组中元素的引用编码为字符串

来自分类Dev

如何在Java中有效地将二进制字符串转换为二进制字节数组?

来自分类Dev

如何在Java中有效地将二进制字符串转换为二进制字节数组?

来自分类Dev

如何在大代码目录中有效地搜索字符串列表

来自分类Dev

将BigInteger二进制转换为BigInteger编号?

来自分类Dev

如何使用python有效地匹配两个大列表之间的字符串?(510.000.000比较)

来自分类Dev

有效地将pandas数据框列名转换为行值

来自分类Dev

如何有效地将Java代码转换为python?

来自分类Dev

如何有效地将Matlab引擎数组转换为numpy ndarray?

来自分类常见问题

在R中有效地将反斜杠转换为正斜杠

来自分类Dev

如何最有效地将Scala DataFrame的行转换为案例类?

来自分类Dev

如何有效地将NSInteger转换为NSDecimalNumber

来自分类Dev

如何有效地将布尔numpy数组转换为阈值布尔数组?

Related 相关文章

  1. 1

    如何将Biginteger转换为字符串

  2. 2

    将字符转换为BigInteger

  3. 3

    将BigInteger转换为二进制字符串

  4. 4

    如何将BigInteger转换为科学记数字符串并返回?

  5. 5

    将十六进制字符串转换为其等效的BigInteger会使值取反

  6. 6

    C#:BigInteger转换为具有指定基数的字符串

  7. 7

    如何最有效地将特定字节从二进制文件转换为字符串

  8. 8

    有效地将空字符串替换为数组中的null

  9. 9

    有效地将空字符串替换为数组中的null

  10. 10

    如何将解密的 BigInteger 转换回字符串?

  11. 11

    如何有效地从大txt文件中仅读取字符串

  12. 12

    SQL 查询耗时太长 - 具有相同 ID 的多个 AND

  13. 13

    Java的BigInteger toString方法不返回大整数的(非空)字符串

  14. 14

    将 InputStream 转换为 BigInteger

  15. 15

    将 double 转换为 BigInteger

  16. 16

    有效地将布尔数组更改为字符串-Swift

  17. 17

    有效地将多维数组中元素的引用编码为字符串

  18. 18

    如何在Java中有效地将二进制字符串转换为二进制字节数组?

  19. 19

    如何在Java中有效地将二进制字符串转换为二进制字节数组?

  20. 20

    如何在大代码目录中有效地搜索字符串列表

  21. 21

    将BigInteger二进制转换为BigInteger编号?

  22. 22

    如何使用python有效地匹配两个大列表之间的字符串?(510.000.000比较)

  23. 23

    有效地将pandas数据框列名转换为行值

  24. 24

    如何有效地将Java代码转换为python?

  25. 25

    如何有效地将Matlab引擎数组转换为numpy ndarray?

  26. 26

    在R中有效地将反斜杠转换为正斜杠

  27. 27

    如何最有效地将Scala DataFrame的行转换为案例类?

  28. 28

    如何有效地将NSInteger转换为NSDecimalNumber

  29. 29

    如何有效地将布尔numpy数组转换为阈值布尔数组?

热门标签

归档