我即将开始考试,以下问题很有可能出现。如果有人可以帮助我,我真的很感激。谢谢。
使用C#编写一个程序来计算以下收敛级数,精度为10 ^ -10。
x ^(2n-1)/(2n-1)!
我试过了:
class Program
{
static void Main(string[] args)
{
double x, y, numerator, denominator, answer, e = Math.Pow(10,-10);
x = int.Parse(Console.ReadLine());
int n = 0;
do
{
numerator = Math.Pow(x, (2 * n - 1));
denominator = (2 * n - 1);
answer = (numerator / denominator);
n++;
}
while (answer < e);
}
}
我认为我最大的问题是尝试调用阶乘函数。
答案 0 :(得分:2)
请注意x^(2n+1) = x^(2n-1) * x^2
和(2n+1)! = (2n-1)! * 2n * (2n + 1)
。使用这个公式,您可以分别在前一个分子和分母的循环的每次迭代中轻松地重新计算分子和分母。
其余的留给读者。
答案 1 :(得分:0)
我相信当他们说“准确度为10 ^ -10”时,这意味着更改的答案少于从一次传递到另一次传递的答案。你的循环看起来很好,但是你正在检查答案本身,而不是从传递到传递的变化。试试这个改变:
double lastAnswer = 0.0, delta; // couple more vars
do
{
// ... keep current code in loop, add these two lines below
delta = abs(answer - lastAnswer); // the change between passes is what's important
lastAnswer = answer; // and save last answer for next delta
}
while (delta < e); // change condition to check difference
你也可以在n:
上进行“健全性检查”测试while ((delta < e) && (n < 10000000));
如果你的答案不够接近,你可以随时增加n
的限制。
答案 2 :(得分:0)
如果你唯一的问题是如何做一个阶乘,那么这篇文章可能有所帮助:
http://guyellisrocks.com/algorithms/factorial-function-in-c/
他很清楚每次都不需要重新计算这些值。
答案 3 :(得分:0)
我认为这就是你想要的:
class Program
{
static void Main(string[] args)
{
const double tol=1e-10;
double x = 1;
if(args.Length>0)
{
double.TryParse(args[0], out x);
}
int n=1;
const int n_max=100;
double y=x;
while(n<n_max && y>tol)
{
y=y*x*x/(2*n*(2*n+1));
n++;
}
Debug.WriteLine(string.Format( "x={0:R}, y={1:R}, n={2}", x, y, n));
}
}
为什么呢?那么这就是你可以自己解决的部分。