首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Primes Python代码和转换为Java代码

将Primes Python代码和转换为Java代码
EN

Stack Overflow用户
提问于 2019-06-10 16:36:28
回答 1查看 77关注 0票数 0

基本上,我需要帮助将Python中的以下代码转换为Java。

在过去的一天里,我试着学习了一些Python,这样我就可以转换它,但是有些事情我不明白。我试着用Java实现它,但仍然不能工作。如果没有看到“正确”的Java翻译,我就无法看到我的算法哪里出错,以及我的转换哪里有错误。代码使用动态编程计算小于n的所有素数之和。如果我没有弄错,“断言”是java的同义词,但..。不完全确定。特别是我不确定接下来的三行。剩下的我想我可以皈依。所以,如果有人能帮我把这段代码转换成Java,我会很感激,因为我只是无法翻译所有的代码,尽管这是一段相当短的代码。谢谢。

代码语言:javascript
复制
def SOP(n):
    r = int(n**0.5)
    assert r*r <= n and (r+1)**2 > n
    V = [n//i for i in range(1,r+1)]
    V += list(range(V[-1]-1,0,-1))
    S = {i:i*(i+1)//2-1 for i in V}
    for p in range(2,r+1):
        if S[p] > S[p-1]: 
            sp = S[p-1]
            p2 = p*p
            for v in V:
                if v < p2: break
                S[v] -= p*(S[v//p] - sp)
    return S[n]

我尝试的Java代码:

代码语言:javascript
复制
public static long sumOfAllPrimesBelowLimit (long n)
    {
        long r = (long) Math.sqrt(n);
        ArrayList <Long> S = new ArrayList<Long>();

        while (r*r<=n&&(r+1)*(r+1)>n)
        {
            ArrayList <Long> V = new ArrayList <Long> ();
            for (long i = 1;i<=r+1;i++)
                V.add(n/i);

            // V += list(range(V[-1]-1,0,-1)) - I don't know what this means at all

            for (long i:V)
                S.add(i*(i+1)/2-1);
            for (int p=2;p<=r+1;p++)
                if (S.get(p)>S.get(p-1))
                {
                    long sp=S.get(p-1);
                    long p2 = p*p;
                    for (long v:V)
                    {
                        if (v<p2)
                        {
                            break;
                        }
                        S.add((int) v, S.get((int) v)-p*(S.get((int) (v/p))-sp));
                    }
                }
        }
        return S.get((int) n);
    }

我知道它不是100%完整的,因为我不能全部翻译。我认为使用HashMap会更好,但首先我想让基本知识正常运行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-10 17:57:01

如果说有什么区别的话,assertassert的同义词(因为如果不满足,它会抛出一个错误)。Python有一个while循环,它的工作方式与while循环相同。

也就是说,这里有一些Java。在我目前的情况下,我无法测试这一点,而且我已经有一段时间没有使用Java了,但是它应该会或多或少地工作。您可能需要在intInteger之间进行一些转换(或者用long、idk替换所有数据),但是编译器/堆栈跟踪应该告诉您在哪里。

代码语言:javascript
复制
public int SOP(int n) {
    // r = int(n**0.5)
    int r = (int) Math.sqrt(n);                                 
    //  assert r*r <= n and (r+1)**2 > n
    if(!(r * r <= n && (r+1) * (r+1) > n))
        throw new IllegalArgumentException("Assertion error");
    // V = [n//i for i in range(1,r+1)]
    ArrayList<Integer> V = new ArrayList<Integer>();
    for(int i = 1; i < r+1; i++)
        V.add(n / i);
    //V += list(range(V[-1]-1,0,-1))
    for(int i = V[V.size()-1]; i > 0; i--)
        V.add(i);
    // S = {i:i*(i+1)//2-1 for i in V}
    HashMap<Integer, Integer> S = new HashMap<Integer, Integer>();
    for(int i : V)
         S.put(i, (i*(i+1)/2 - 1));
    // for p in range(2,r+1):
    for(int p = 2; p < r+1; p++ {
        // if S[p] > S[p-1]: 
        if S.get(p) > S.get(p-1) {
            // sp = S[p-1]
            int sp = S.get(p-1);
            // p2 = p*p
            int p2 = p * p;
            // for v in V:
            for(int v : V) {
                // if v < p2: break
                if(v < p2)
                    break;
                // S[v] -= p*(S[v//p] - sp)
                S.put(v, S.get(v) - p*(S.get(v/p)-sp));
            }
        }
    }
    // return S[n]
    return S.get(n);
}

也就是说,这个算法有点迟钝。如果是我,我只需要编写一个is_prime()函数,然后从0计数到n,并添加那些是的。后一步可以在单行python中完成,在Java中不会占用这么多。

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

https://stackoverflow.com/questions/56530264

复制
相关文章

相似问题

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