我是一个完全的初学者。我在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.63092975357
(例如)i
和j
必须等于{{分别为1}}和n/60
,其中m/60
和n
为正整数。 (我知道我可以使用m
类型而不是int
类型,但我想使用double
类型。
但它不起作用。当我点击“运行项目”时,会弹出黑屏,但没有任何反应...... SharpDevelop没有指出任何错误......
那么我犯了什么错误?以及如何修复我的程序?
答案 0 :(得分: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是双重类型。因此,你的师现在重新调整了双*
答案 1 :(得分:1)
我在这里看到的错误是使用1/60,期望它是一个代表0.0166的双...实际上是0,因为1和60都是整数,这就变成了整数除法。尝试使用1.0 / 60.0,1 / 60.0或1.0 / 60,1 / 60d或这些的任意组合,并且应该修复它,假设您的算法在数学上是正确的。
一旦你解决了这个问题,你可能会开始看到大量的行打印一些结果,因为你的程序不会终止直到循环结束,甚至认为它可能已经打印了大量数据。您可以通过添加一个标志变量(bool)来终止外部循环来修复它,并break
来终止内部循环。
答案 2 :(得分: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);
答案 3 :(得分:0)
1 / 60
会执行integer division,因此总会生成0
。它总是丢弃小数部分。
分割两个整数时,结果始终为整数。对于 例如,7/3的结果是2。
这就是为什么你的第一个for循环会是这样的;
for(i = 1; i <= 30; i += 0)
因为i
永远不会增加,所以永远不会30
,这就是为什么会产生infinite loop。
作为解决方案,您需要使用浮点除法。
for(i = 1; i <= 30; i += (1 / 60f))
{
for(j = 1+1/60f; j <= 30; j += (1 / 60))
除此之外,我建议你阅读Eric Lippert的How to debug small programs,你可以轻松找到代码中的错误,甚至不用问这里。