以下问题在我的一个考试中给出,并被要求仅使用Java解决以下问题。
问题是,我陷入了程序应该将给定的非负整数作为数字数组返回的部分。任何人都可以提供解决方案吗?
提前致谢。
如果其中一个条件成立,则称两个正数A和B连接(用“A↔B”表示): (1)A和B长度相同,只有一位数不同;例如,123↔173。 (2)在A(或B)的左边添加一个数字,使B(或A);例如,23↔223和123↔23。
如果在2和P之间存在连通素数链并且链中没有素数超过P,则称为素数P 2为2的相对值。
例如,127是2的亲戚。其中一个可能的链如下所示: 2↔3↔13↔113↔103↔107↔127 但是,11和103不是2的亲戚。
设F(N)是素数≤N的和,它们不是2的亲属。 我们可以验证F(103)= 431和F(104)= 78728。
找到F(107)。
编辑:我的部分 对不起,我不记得我的解决方案,因为我没有把结果交给我。但只是为了这个问题,我认为它应该返回非负数的部分,我有这样的东西 -
private static int[] toDigits(int n) {
if (n < 0)
throw new IllegalArgumentException();
int[] temp = new int[10];
int len = 0;
do {
temp[len] = n % 9;
n /= 9;
len++;
} while (n > 0);
答案 0 :(得分:-1)
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Queue;
public final class infinitybyone implements TestSolution {
public static void main(String[] args) {
System.out.println(new infinitybyone().run());
}
private static final int LIMIT = Library.pow(10, 7);
public String run() {
boolean[] isPrime = Library.listPrimality(LIMIT);
int[] pathMax = new int[isPrime.length];
Arrays.fill(pathMax, Integer.MAX_VALUE);
Queue<IntPair> queue = new PriorityQueue<>();
queue.add(new IntPair(2, 2));
while (!queue.isEmpty()) {
IntPair item = queue.remove();
int n = item.b;
int pmax = item.a;
if (pmax >= pathMax[n]) {
continue;
}
pathMax[n] = pmax;
int[] digits = toDigits(n);
int[] tempDigits = digits.clone();
for (int i = 0; i < tempDigits.length; i++) {
for (int j = 0; j < 10; j++) {
tempDigits[i] = j;
int m = toNumber(tempDigits);
int nextPmax = Math.max(m, pmax);
if (m < isPrime.length && isPrime[m] && nextPmax < pathMax[m])
queue.add(new IntPair(nextPmax, m));
}
tempDigits[i] = digits[i];
}
}
long sum = 0;
for (int i = 0; i < isPrime.length; i++) {
if (isPrime[i] && pathMax[i] > i)
sum += i;
}
return Long.toString(sum);
}
private static int[] toDigits(int n) {
if (n < 0)
throw new IllegalArgumentException();
//************This is PROBABLY where you made the error************
int[] temp = new int[11];
int len = 0;
do {
temp[len] = n % 10;
n /= 10;
len++;
} while (n > 0);
int[] result = new int[len + 1];
for (int i = 0; i < result.length; i++)
result[i] = temp[len - i];
return result;
}
private static int toNumber(int[] digits) {
int result = 0;
for (int x : digits)
result = result * 10 + x;
return result;
}
private static class IntPair implements Comparable<IntPair> {
public final int a;
public final int b;
public IntPair(int a, int b) {
this.a = a;
this.b = b;
}
public int compareTo(IntPair other) {
return Integer.compare(a, other.a);
}
}
}
我无法确切地说出你搞砸了哪里,但至少从你分享的代码中,告诉我为什么你会使用10
代替11
?它应该以little endian提取base-10
。