在循环中添加1 / n ^ 2 + 1 /(n + 1)^ 2 + ....

时间:2014-02-01 16:12:34

标签: c# loops

我对编程很陌生,所以这对大多数人来说应该不是问题。我应该编写一个总和1 / n ^ 2(n是连续自然数)的程序,而元素大于常数eps = 0,001。我写了一段代码并尝试编辑它,但我仍然陷入无限循环,我只是得到连续的数字,但很明显,总和应该在1到2之间。我要感激不止任何人都可以告诉我,我做错了什么。

namespace program
{
    class Program
    {
        static void Main(string[] args)
        {
            const double eps=0.001;
            int n=1;
            double x;
            x = 1 / (n * n);
            double sum=x;
            while (x > eps)
            {
                n++;
                sum = sum + x;
                Console.WriteLine(sum);
            }
            Console.Write("\nSum: {0}.", sum);
            Console.ReadLine();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您永远不会重新计算x的值,因此while条件永远不会变为false。如果你在里面移动作业,你的代码将永远不会循环。

const double eps=0.001;
int n=1;
double x;

double sum=x;
while (true)
{
    x = 1.0 / (n * n);
    if (x < eps) {
        break;
    }
    n++;
    sum = sum + x;
    Console.WriteLine(sum);
}
Console.Write("\nSum: {0}.", sum);
Console.ReadLine();

答案 1 :(得分:0)

有几件事。首先

1 / (n * n) 

是一个整数表达式,始终为01。你需要使它像这样的浮点表达式:

1.0 / (n * n) 

然后您需要在循环内更新x,而不是只分配一次x

也许是这样:

static void Main(string[] args)
{
    const double eps = 0.001;
    int n = 1;
    double x = 1.0 / (n * n);
    double sum = 0.0;
    while (x > eps)
    {
        sum += x;
        n++;
        x = 1.0 / (n*n);
        Console.WriteLine(sum);
    };
    Console.Write("\nSum: {0}", sum);
    Console.ReadLine();
}

这样做的缺点是x的表达式被写了两次。所以更好的方法是这样的:

static void Main(string[] args)
{
    const double eps = 0.001;
    int n = 1;
    double sum = 0.0;
    while (true)
    {
        double x = 1.0 / (n * n);
        if (x <= eps)
            break;

        sum += x;
        n++;
        Console.WriteLine(sum);
    };
    Console.Write("\nSum: {0}", sum);
    Console.ReadLine();
}