我对编程很陌生,所以这对大多数人来说应该不是问题。我应该编写一个总和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();
}
}
}
答案 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)
是一个整数表达式,始终为0
或1
。你需要使它像这样的浮点表达式:
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();
}