-3

我是一个完整的初学者。我在 SharpDevelop 上编写了一个小型 C# 程序。这里是:

double i, j;

for(i=1; i<=30; i+=(1/60))
{
    for(j=1+1/60; j<=30; j+=(1/60))
    {
        if(Math.Abs(Math.Log(i)/Math.Log(j)-0.63092975357)<=0.00001)
        {
            Console.WriteLine("ln("+i+")   ln("+j+")");
        }
    }
}

        Console.ReadKey(true);

我的程序应该找到i和(j例如ln(i)/ln(j)=0.63092975357ij必须分别等于n/60m/60,其中nm是正整数。(我知道我可以使用 typeint而不是 type double,但我想让它与 type 一起使用double。)

但它不起作用。当我点击“运行项目”时,弹出黑屏,但什么也没有发生……而且SharpDevelop没有指出任何错误……

那么我犯了哪些错误呢?以及如何修复我的程序?

4

4 回答 4

4

整数除法。

1/60 = 0

你需要1 / 60.0d

当你除以一个整数时,你会得到一个整数结果。整数不能存储小数。

当你在做的时候,1/60你期望0.0166666666666667它实际上是 0。

此代码现在有效

double i, j;

for(i=1; i<=30; i+=(1/60d))
{
  for(j=1+1/60d; j<=30; j+=(1/60d))
  {
      if(Math.Abs(Math.Log(i)/Math.Log(j)-0.63092975357)<=0.00001) 
          Console.WriteLine("ln("+i+")   ln("+j+")"); 
  }
}

编辑:*可能值得一提,写作60d确保 60 是双精度类型。因此,您的部门现在返回双 *

于 2014-10-24T06:41:36.150 回答
1

我在这里看到的错误是使用 1/60 期望它是代表 0.0166 的双精度...实际上是 0,因为 1 和 60 都是整数,这成为整数除法。假设您的算法在数学上是正确的,请尝试使用 1.0/60.0、1/60.0 或 1.0/60、1/60d 或这些的任何组合,这应该可以解决它。

一旦你解决了这个问题,你可能会开始看到大量的行打印一些结果,因为你的程序在循环完成之前不会终止,即使它可能已经在打印大量数据。您可以通过添加一个标志变量(一个布尔值)来终止外部循环并break终止内部循环来修复它。

于 2014-10-24T06:40:58.103 回答
1

您可以通过保留循环和整数,然后在您需要它们用于日志功能时计算出双精度数,从而使您的生活更轻松一些。

此外,通过在 ReadKey 之前添加 Console.Write() ,您可以看到循环何时结束。

for(var i=1; i<=1800; i++)
{
    for(var j=1; j<=1800; j++)
    {
        double di = double(i)/60.0; 
        double dj = double(j)/60.0;

        if(Math.Abs((Math.Log(di)/Math.Log(dj))-0.63092975357)<=0.00001)
        {
            Console.WriteLine("ln("+di+")   ln("+dj+")");
        }
    }
}

Console.WriteLine("Press any key to continue");
Console.ReadKey(true);
于 2014-10-24T06:49:46.353 回答
0

1 / 60执行整数除法,它总是生成0结果。它总是丢弃小数部分。

/运算符(C# 参考)

当你将两个整数相除时,结果总是一个整数。例如,7 / 3 的结果是 2。

这就是为什么你的第一个 for 循环会像这样;

for(i = 1; i <= 30; i += 0)

因为i永远不会增加,所以永远不会增加,这30就是为什么这会产生无限循环

作为一种解决方案,您需要改用浮点除法。

for(i = 1; i <= 30; i += (1 / 60f))
{
    for(j = 1+1/60f; j <= 30; j += (1 / 60))

除此之外,我建议您阅读 Eric Lippert 的如何调试小程序,您无需在这里询问即可轻松找到代码中的错误。

于 2014-10-24T06:46:03.880 回答