首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stackoverflow异常未处理

stackoverflow异常未处理
EN

Stack Overflow用户
提问于 2010-12-20 13:17:41
回答 5查看 3K关注 0票数 1

在下面的代码中,它应该乘以2个数字。它适用于3位或3位以下的数字,但是当我给出4位或更大的数字时,它会给出运行时错误:stackoverflow exception was unhandled。我已经说过问题出在哪里。我认为问题在于如何在int中定义变量,并在很长一段时间内更改它们,但问题仍然存在。哪里出错了?

编辑:,现在,你对这个问题有什么看法?它什么也做不了

代码语言:javascript
复制
        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();
        }
    }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-20 14:20:25

编辑:我已经为你完全翻译了书中描述的算法:

代码语言:javascript
复制
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;
    }
}

要获得正确的结果,您可以从其他一些方法中调用这个方法,比如:

代码语言:javascript
复制
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,您可以这样做来进行调用:

代码语言:javascript
复制
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控制输入和如何处理输出。

票数 2
EN

Stack Overflow用户

发布于 2010-12-20 13:44:02

此时,您将进入无限递归循环。

代码语言:javascript
复制
 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,那么.”

票数 3
EN

Stack Overflow用户

发布于 2010-12-20 13:37:54

简单地说,您有一个潜在的(在输入上不同的)情况:

代码语言:javascript
复制
function bigzarb()
{
    bigzarb()
}

只要textBox7中的数字大于3,即一个未闭合的递归循环,这将不可避免地成为堆栈溢出。

在这条线上放置一个断点,你很快就会发现问题所在。在不知道您的方法是做什么的情况下(我不认识算法),我对清理它无能为力,但是第一步可能是有条件地从函数返回一个get out子句。但是,我也看到您在使用输入参数uv之前重写了它们,所以您可能在algo中犯了一个错误?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4489987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档