1

我正在学习 C# atm 并试图解决我书中描述的问题之一。编写一个程序,计算并打印(精度为 0.001)序列 1 + 1/2 - 1/3 + 1/4 - 1/5 + ...。我知道这是一个常见问题,但我几乎输了一整天来解决它,但我不能一个人做(也许我不够努力)。

static void Main()
{
    double sum = 0D;
    double sum1 = 0d;
    int i = 1;
    while ( i <100)
    {
        i++;
        if (i % 2 == 0)
        {
            sum1 = sum1 +(1 / i);
        }
        else
        {
            sum1 = sum1 -(1 / i);
        }

        sum = sum1 + sum;
        Console.WriteLine(Math.Round(sum, 3));
    }
}
4

3 回答 3

10

由于“i”是整数,除法 1/i 将始终得到 0(i=1 时除外),因为“/”是整数除法运算符,它从不给出分数。因此,您应该将双精度值 1.0/i 相除以获得分数。

此外,循环条件 i<100 不是您需要的。最好设置在那里 (1.0/i > 0.001) 或转换 (i<1000)。对于您拥有的序列,它将保证所需的准确性。

于 2012-07-21T16:21:56.633 回答
1

您没有将其计算到 0.001 的精度,而是在每一步四舍五入。你需要让你的循环运行只要abs(current_sum - previous_sum) >= 0.001. current_sum是当前迭代和上一次迭代的总和previous_sum

于 2012-07-21T16:20:04.477 回答
-2

你已经知道这是谐波级数了吗?

关于谐波系列的维基百科

这很容易计算,但我不确定你对精密部分的意思。

        double harmonic = 0;
        int partialSumsUpTo = 10000;

        for (double i = 1; i <= partialSumsUpTo; ++i)
        {
            double part = 1 / i;
            harmonic += Math.Round(part, 5);
        }

请注意,这不是剧透,因为您需要交替谐波系列 作为您的作业。但你肯定会自己得到那部分。

于 2012-07-21T16:46:11.423 回答