我完成了使用任务创建程序的作业。
该程序应生成100,000个数字,范围从100,000到100,000,000 然后检查数字是否为素数,如果该数字是斐波纳契数。
此计划有严格的要求:
1)第一项任务应生成数字。
2)第二项任务应检查数字是否为素数。
3)第三项任务应检查数字是否为斐波那契。
!!只有在第三个行动计划之后才应生成新的号码。 !!
我已经编写了一个程序,但是在生成所有数字之前需要很长时间。我做错了什么?还有其他方法可以更快地完成吗?因为生成所有数字大约需要25分钟。 (我使用的是MS VStudio 2010,Framework 4)
抱歉我的英文..
代码:
for (int i = 0; i < 100000; i++)
{
Task<int> t1 = Task<int>.Factory.StartNew(() => RandomGen1.Next()); // Generate Number
Task<string> t2 = Task<string>.Factory.StartNew(() => is_prime(t1.Result)); // Return Yes or No
Task<string> t3 = Task<string>.Factory.StartNew(() => IsFibonacci(t1.Result)); // Return Yes or No
Task.WaitAll(new Task[] {t1,t2,t3});
this.dataGridView1.Rows.Add(t1.Result, t2.Result, t3.Result);
}
更新
这是我的is_prime和isFibonacci函数:
public string is_prime(int number)
{
for (int i = 2; i < number; ++i)
{
if (number % i == 0)
{
return "";
}
}
return "Yes";
}
static string IsFibonacci(int number)
{
double fi = (1 + Math.Sqrt(5)) / 2.0; //Golden ratio
int n = (int)Math.Floor(Math.Log(number * Math.Sqrt(5) + 0.5, fi)); //Find's the index (n) of the given number in the fibonacci sequence
int actualFibonacciNumber = (int)Math.Floor(Math.Pow(fi, n) / Math.Sqrt(5) + 0.5); //Finds the actual number corresponding to given index (n)
if (actualFibonacciNumber == number)
{
return "Yes";
}
return "";
}
答案 0 :(得分:0)
虽然我通常不会为人们做家庭作业,但我发现这是一个很好的问题需要解决,而且我有一些代码可以解决我可以使用的Project Euler问题。
我同意其中一条评论,这是一个奇怪的要求,用于任务,似乎只是为了它使用任务。
我放在一起的控制台应用程序运行大约15秒。不,我不打算发布代码,因为你不会学到任何东西。
如果没有看到is_prime
和IsFibonacci
方法背后的代码,很难说出错了什么。我希望你没有做一些愚蠢的事情,比如在循环的每次迭代中计算所有斐波纳契数列表到随机数,因为这将非常慢。
请记住:A number is Fibonacci if and only if one or both of (5*n2 + 4) or (5*n2 – 4) is a perfect square.