将素数和 Python 代码转换为 Java 代码
Converting Sum of Primes Python Code to Java Code
基本上我需要帮助将 Python 中的以下代码翻译成 Java。
前几天我试着学习了一点Python以便我可以转换它,但是有些地方我不明白。我试图在 Java 中实现它,但它仍然不起作用。没有看到 'correct' Java 翻译,我看不出我的算法哪里出了问题,我的转换哪里有错误。该代码使用动态规划来评估小于 n
的所有素数的总和。如果我没记错的话,'assert' 是 java 'while' 的同义词,但是.. 不完全确定。特别是我不确定它后面的 3 行。其余的我想我可以转换。因此,如果有人可以帮助我将此代码转换为 Java,我将不胜感激,因为我无法翻译所有代码,即使它是一个相当短的代码。谢谢。
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 代码:
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 会更好,但首先我想正确地掌握 运行 的基础知识。
assert
如果有的话,是 Java assert
的同义词(因为如果不满足它会抛出错误)。 Python 有一个 while
循环,其工作方式与 Java 的 while
循环相同。
也就是说,这里有一些 Java。在我目前的情况下,我无法对此进行测试,而且我已经有一段时间没有完成 Java,但它应该 more-or-less 有效。您可能需要在 int
和 Integer
之间进行一些转换(或者用 long
s 替换所有内容,idk),但是您的 compiler/stacktrace 应该告诉您在哪里。
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.
中占用这么多
基本上我需要帮助将 Python 中的以下代码翻译成 Java。
前几天我试着学习了一点Python以便我可以转换它,但是有些地方我不明白。我试图在 Java 中实现它,但它仍然不起作用。没有看到 'correct' Java 翻译,我看不出我的算法哪里出了问题,我的转换哪里有错误。该代码使用动态规划来评估小于 n
的所有素数的总和。如果我没记错的话,'assert' 是 java 'while' 的同义词,但是.. 不完全确定。特别是我不确定它后面的 3 行。其余的我想我可以转换。因此,如果有人可以帮助我将此代码转换为 Java,我将不胜感激,因为我无法翻译所有代码,即使它是一个相当短的代码。谢谢。
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 代码:
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 会更好,但首先我想正确地掌握 运行 的基础知识。
assert
如果有的话,是 Java assert
的同义词(因为如果不满足它会抛出错误)。 Python 有一个 while
循环,其工作方式与 Java 的 while
循环相同。
也就是说,这里有一些 Java。在我目前的情况下,我无法对此进行测试,而且我已经有一段时间没有完成 Java,但它应该 more-or-less 有效。您可能需要在 int
和 Integer
之间进行一些转换(或者用 long
s 替换所有内容,idk),但是您的 compiler/stacktrace 应该告诉您在哪里。
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.