我正在寻找一种方法来使用任务来计算数字的阶乘。我的目的是使用顺序循环将结果与阶乘进行比较。例如 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()
}
答案 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;
}