使用任务的因子

时间:2017-03-11 22:12:43

标签: c#

我正在寻找一种方法来使用任务来计算数字的阶乘。我的目的是使用顺序循环将结果与阶乘进行比较。例如 16! task1 = 16 * 15 * 14 * 13 * 12 * 11和task2 = 10 * 9 * 8 * 7 * 6和task3 = 5 * 4 * 3 * 2 * 1 我在网上搜索过,但找不到符合我需要的解决方案。谢谢你的期待。

static long factorialmethod(int number)
         {
            long factorial;
            factorial = number;
            if (number <= 1) { return 1; }
            else
            for (int i = number-1; i >= number; i--)
            {
                factorial *= i;
            }
        return factorial;
           }
      static void Main(string[] args)
         {
        int number;
        Console.WriteLine("Please input your whole number");
        number = int.Parse(Console.ReadLine());
        Console.WriteLine("\nFactorial of the number is {0}",factorialmethod(number));
        Console.ReadKey()
         }

2 个答案:

答案 0 :(得分:1)

计算factorial时尝试并行的最简单方法是 PLinq Parallel Linq):

    using System.Linq;

    ...

    static long factorialmethod(int number) {
      if (number <= 1)
        return 1; // strictly speaking, factorial on negative (-N)! = infinity

      return Enumerable
       .Range(1, number)
       .AsParallel() // comment it out if you want sequential version
       .Aggregate(1L, (s, a) => s * a);
    }

使用Stopwatch进行基准测试;注释掉.AsParallel():你真的想要并行实现(仅让Task)吗?

答案 1 :(得分:0)

如果你想要PLINQ方式,可以使用@DmitryBychenko答案。但作为替代方案,您也可以直接使用Parallel库。如果您真的试图使用任务库解决您所述的问题,我认为PLINQ是一个更清洁的解决方案,但如果您使用已发布的问题作为某些类似问题的简化版本,您需要更多控制,那么以下解决方案可能帮助

static long Factorial(int number) {
    if (number < 1)
        return 1;

    var results = new ConcurrentBag<long>();
    Parallel.ForEach(Partitioner.Create(1, number + 1, 5 /*You can select your range size here. You can also derive it based on Environment.ProcessorCount, if you so wish */),
        (range, loopState) => {
            long product = 1;
            for (int i = range.Item1; i < range.Item2; i++) {
                product *= i;
            }
            results.Add(product);
        });

    long factorial = 1;
    foreach (var item in results)
        factorial *= item;
    return factorial;
}