总结无限系列1 / n

时间:2016-03-29 03:20:29

标签: c#

我刚刚开始学习编码和一般(从c#开始)的第一步,我正在从一本书中学习。这本书在每一章的最后留下了问题。我目前不确定如何处理这个具体问题。问题如下:

问题:编写一个程序,计算以下序列的总和(精度为0.001):1 + 1/2 - 1/3 + 1/4 - 1/5 + ... 1 / n

本书针对此问题提供了以下指导原则:

指南行:累积while循环中变量的序列总和(请参阅“循环”一章)。在每个步骤中将旧总和与新总和进行比较。如果两个和Math.Abs​​(current_sum - old_sum)之间的差值小于要求的精度(0.001),则计算应该完成,因为差值不断减小,并且精度在循环的每个步骤中不断增加。预期结果为1.307

我知道如何实现这个但我不知道在总和达到所需精度时如何或在何处启动和中断循环。我目前使用用户输入来输入n。我想知道如何自动化这个过程。

到目前为止,这是我的代码。我知道它的警察使用格式{N:2},但我不知道如何继续。非常感谢帮助!谢谢!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Demo
{
    class Program
{
    static void Main()
    {

        Console.Write("Please enter n: ");
        double counter = double.Parse(Console.ReadLine());
        double sum = 1 + AddSum(counter); // calculate infinite sum 
        Console.WriteLine("Sum = {0:N3}", sum);



    }


    static double AddSum(double n)
    {
        double a = 0;

        for (double i = 1; i < n; i++)
        {
            if(i % 2 == 0)
            {
                a -= 1 / (i +1); // calculates negative fractions
            }

            else
            {
                a += 1 / (i +1); // calculates positive fractions
            }
        }

        return a;
    }

}

3 个答案:

答案 0 :(得分:0)

以下是一个不受subtractive cancellation影响的示例:

static double AddSum()
{
    double pos = 1.0;
    double neg = 0.0;

    double delta = 0.001;
    double current = pos + neg;
    double previous = pos + 2.0 * delta;

    int i = 2;
    while (Math.Abs(current - previous) >= delta)
    {
        if (i % 2 == 0)
        {
            pos += 1.0 / i;
        }
        else
        {
            neg -= 1.0 / i;
        }
        previous = current;
        current = pos + neg;

        i++;
    }

    return current;
}

答案 1 :(得分:-1)

您可能希望遵循给定的准则:不要输入n,因为程序将自动完成。建议的while循环在哪里?您自己可以快速找出答案: - )

也许从这开头:

static void Main()
{
    decimal result = 1;
    int n = 1;
    do
    {
        // remember the current result
        result += 1 / (++n * DetermineMultiplier(n));
    } while ( /* precision calculation here */ );

    // print result and n
}

private int DetermineMultiplier(int n)
{
   // return -1 if n is odd, 1 if it is even
}

答案 2 :(得分:-1)

由于您不想指定validationForm(numberOfPassengers){ for (let i=0; i < numberOfPassengers; i++) { let firstName = ReactDOM.findDOMNode(this.refs['firstName'+typeOfPassenger+i]).value; let lastName = ReactDOM.findDOMNode(this.refs["lastName"+typeOfPassenger+i]).value let age = ReactDOM.findDOMNode(this.refs['age'+typeOfPassenger+i]).value; let regex = /^[A-Za-z0-9 _]*[A-Za-z0-9][A-Za-z0-9 _]*$/; let resultFirstName = firstName.match(regex); let resultLastName = firstName.match(regex); if(age <= 0){ ('.age-alignment').addClass('error-border'); }else{ return age; }; if(resultFirstName){ return firstName; }else{ ('.first-name').addClass('error-border'); }; if(resultLastName){ return lastName; }else{ ('.last-name').addClass('error-border'); }; } } 并且唯一的退出条件是精确检查,您可以这样做。

n

工作Example