在下面的代码中,它应该乘以2个数字。它适用于3位或3位以下的数字,但是当我给出4位或更大的数字时,它会给出运行时错误:stackoverflow exception was unhandled。我已经说过问题出在哪里。我认为问题在于如何在int中定义变量,并在很长一段时间内更改它们,但问题仍然存在。哪里出错了?
编辑:,现在,你对这个问题有什么看法?它什么也做不了
public long Prod2(long u, long v)
{
var numbers = textBox7.Text.Split(',').Select(p => long.Parse(p)).ToArray();
int n = Math.Max((int)Math.Floor(Math.Log10(u) + 1),(int)Math.Floor(Math.Log10(v) + 1));
int threshold = 3;
if (u == 0 || v == 0)
{
return 0;
}
else if (n <= threshold)
{
return u * v;
}
else
{
int m = (int)Math.Ceiling(n / 2.0);
int x = (int)(u / Math.Pow(10, m));
int y = (int)(u % Math.Pow(10, m));
int w = (int)(u / Math.Pow(10, m));
int z = (int)(v % Math.Pow(10, m));
long r = Prod2(x + y, w + z);
long p = Prod2(x, w);
long q = Prod2(y, z);
return p * (long)Math.Pow(10, 2 * m) + (r - p - q) * (long)Math.Pow(10, m) + q;
long result = Prod2(numbers[0], numbers[1]);
textBox1.Text = result.ToString();
}
}发布于 2010-12-20 14:20:25
编辑:我已经为你完全翻译了书中描述的算法:
public long Prod2(long u, long v)
{
int n = Math.Max((int)Math.Floor(Math.Log10(u) + 1), (int)Math.Floor(Math.Log10(v) + 1));
int threshold = 3;
if(u == 0 || v == 0)
{
return 0;
}
else if(n <= threshold)
{
return u * v;
}
else
{
int m = (int)Math.Ceiling(n / 2.0);
int x = (int)(u / Math.Pow(10, m));
int y = (int)(u % Math.Pow(10, m));
int w = (int)(u / Math.Pow(10, m));
int z = (int)(v % Math.Pow(10, m));
long r = Prod2(x + y, w + z);
long p = Prod2(x, w);
long q = Prod2(y, z);
return p * (long)Math.Pow(10, 2 * m) + (r - p - q) * (long)Math.Pow(10, m) + q;
}
}要获得正确的结果,您可以从其他一些方法中调用这个方法,比如:
void Main()
{
// Call the method and store the result in variable 'r'.
long r = Prod2(1234, 5678);
Console.WriteLine(r);
/////////////////////////////////
//
// OR - In your case read from textBox7 and then store the result in textBox1
//
/////////////////////////////////
var numbers = textBox7.Text.Split(',').Select(p => long.Parse(p)).ToArray();
long result = prod2(numbers[0], numbers[1]);
textBox1.Text = result.ToString();
}因此,在您的事件处理程序中,例如对于button1,您可以这样做来进行调用:
public void button1_Click()
{
var numbers = textBox7.Text.Split(',').Select(p => long.Parse(p)).ToArray();
long result = prod2(numbers[0], numbers[1]);
textBox1.Text = result.ToString();
}不要修改我所拥有的Prod2,只需将其粘贴到代码中即可。通过这种方式,Prod2进行计算,然后button1_Click控制输入和如何处理输出。
发布于 2010-12-20 13:44:02
此时,您将进入无限递归循环。
long result = bigzarb(x, w) * Math.Pow(10, m) + (bigzarb(x, w) + bigzarb(w, y)) * Math.Pow(10, m) + bigzarb(y, z);///here
textBox1.Text = result.ToString();我注意到只有在intn > 3时才执行这一行,所以您可能有逻辑错误吗?
更新:在阅读您的评论后,我可以看到这个测试的目的是:“如果这个字符串的长度是<= 3,那么.”事实上,正如所写的那样,它实际上是在说“如果这个转换的字符串的值是<= 3,那么.”
发布于 2010-12-20 13:37:54
简单地说,您有一个潜在的(在输入上不同的)情况:
function bigzarb()
{
bigzarb()
}只要textBox7中的数字大于3,即一个未闭合的递归循环,这将不可避免地成为堆栈溢出。
在这条线上放置一个断点,你很快就会发现问题所在。在不知道您的方法是做什么的情况下(我不认识算法),我对清理它无能为力,但是第一步可能是有条件地从函数返回一个get out子句。但是,我也看到您在使用输入参数u和v之前重写了它们,所以您可能在algo中犯了一个错误?
https://stackoverflow.com/questions/4489987
复制相似问题