基本上,我需要将Python中的以下代码转换为Java的帮助。
在过去的一天中,我尝试学习一些Python,以便可以对其进行转换,但是有些事情我不理解。我尝试用Java实现它,但仍然无法正常工作。没有看到“正确的” Java翻译,我看不到算法哪里出错了,以及我的转换哪里出错了。该代码使用动态编程来评估所有小于n
的素数之和。如果我没记错的话,“断言”是java“ while”的同义词,但是..不能完全确定。特别是我不确定其后的三行内容。其余的我想我可以转换。因此,如果有人可以帮助我将这段代码转换为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了,但是它或多或少都可以工作。您可能需要在int
和Integer
之间进行一些强制转换(或将所有内容替换为long
s,idk),但是编译器/堆栈跟踪器应该告诉您在哪里。
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中则不需要那么多。
我可以在Hashmaps中使用数组吗?如果是这样,则声明这种哈希图的确切语法是什么?谢谢 参考方案 数组也是对象。甚至像int[]这样的原始数组。Map<String,String[]> map = new HashMap<String,String[]>();
Java中的<<或>>>是什么意思? - javaThis question already has answers here: Closed 7 years ago. Possible Duplicate: What does >> and >>> mean in Java?我在一些Java代码中遇到了一些陌生的符号,尽管代码可以正确编译和运行,但对于括号在此代码中的作用却感…
菱形运算符<>是否等于<?> - java我在util.TreeSet类中发现,其中一个构造函数正在使用具有空泛型类型的新TreeMap调用另一个构造函数。 public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); } new TreeMap<>是什么意思…
与哪些运算符>>兼容 - java我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…
Java-将int更改为ascii - javajava有没有办法将int转换为ascii符号? 参考方案 您是否要将int转换为char?:int yourInt = 33; char ch = (char) yourInt; System.out.println(yourInt); System.out.println(ch); // Output: // 33 // ! 还是要将int转换为Stri…