首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归的Karatsuba乘法不起作用?

递归的Karatsuba乘法不起作用?
EN

Stack Overflow用户
提问于 2015-01-30 10:24:06
回答 1查看 2.3K关注 0票数 7

我试图通过递归调用实现Karatsuba增殖。下面的代码应该有效,但我总是得到错误的答案。有什么想法吗?

代码语言:javascript
复制
    public static long karatsuba(long x, long y){
        //base case:
        if (x < 10 || y < 10) return x * y;

        //length of digits:
        int xSize = String.valueOf(x).length();
        int ySize = String.valueOf(y).length();
        int N     = Math.max(xSize, ySize);

        //split each number in half (by length of digits):
        long numX_hi = Long.valueOf((String.valueOf(x).substring(0, N/2)));
        long numX_lo = Long.valueOf((String.valueOf(x).substring(N/2, xSize)));
        long numY_hi = Long.valueOf((String.valueOf(y).substring(0, N/2)));
        long numY_lo = Long.valueOf((String.valueOf(y).substring(N/2, ySize)));

        //solve multiplications recursively:
        long z0 = karatsuba(numX_lo,numY_lo);
        long z1 = karatsuba((numX_hi+numX_lo),(numY_hi+numY_lo));
        long z2 = karatsuba(numX_hi,numY_hi);

        //answer:
        return  (long)(z2 * Math.pow(10,N))  +  (long)((z1-z2-z0) * Math.pow(10,(N/2)))  +  (z0);
    }

下面是几个测试用例:

1) karatsuba(1234,5678) >>> 6952652

*应该是7006652

2) karatsuba(4589,7831) >>> 34649459

*应该是35936459

3) karatsuba(911,482) >>> 44722

*应该是472842

EN

回答 1

Stack Overflow用户

发布于 2020-12-29 05:57:29

如果一个数字字符串的长度大于另一个数字字符串的两倍,则接受的解决方案将给出一个StringIndexOutOfBoundsException,因为splitX或splitY将为负数。

要防止此问题,必须捕获此异常,然后将halfN设置为Math.min(xSize,ySize)/2。以下是修正后的代码:

代码语言:javascript
复制
public static long karatsuba(long x, long y){
    //base case:
    if (x < 10 || y < 10) return x * y;

    //length of digits:
    int xSize = String.valueOf(x).length();
    int ySize = String.valueOf(y).length();

    int halfN = Math.max(xSize, ySize) / 2; // store N/2 instead of N
    if (halfN >= xSize || halfN >= ySize){
        halfN = Math.min(xSize, ySize) / 2; // prevents string index error
    }
    int splitX = xSize - halfN;  // count the split point from xSize down
    int splitY = ySize - halfN;  // count the split point from ySize down

    //split each number in half (by length of digits):
    long numX_hi = Long.valueOf((String.valueOf(x).substring(0, splitX)));
    long numX_lo = Long.valueOf((String.valueOf(x).substring(splitX)));
    long numY_hi = Long.valueOf((String.valueOf(y).substring(0, splitY)));
    long numY_lo = Long.valueOf((String.valueOf(y).substring(splitY)));

    //solve multiplications recursively:
    long z0 = karatsuba(numX_lo,numY_lo);
    long z1 = karatsuba((numX_hi+numX_lo),(numY_hi+numY_lo));
    long z2 = karatsuba(numX_hi,numY_hi);

    //answer:
    return  (long)(z2 * Math.pow(10,halfN*2))  +  (long)((z1-z2-z0) * Math.pow(10,halfN))  +  (z0);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28233748

复制
相关文章

相似问题

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