JavaとRubyの素数[終了]
概要
この回答から Ruby コードを Java コードに変換しようとしました。
文章
私のコードは以下です。ご覧のとおり、Java には素数がないため (Ruby の require prime 行によりすべての数値が素数になります)、私のプログラムは単純にすべての数値を返します。 Java でこれを行う方法がわかりません。助けていただければ幸いです。
import java.util.HashSet;
import java.util.Set;
public class sus {
public static void main(String[] args) {
long maxNum = 9876543210L;
int minNum = 1023456789;
int maxPrimeToCube = 2143;
int count = 0;
for (int primeToCube = 2; primeToCube <= maxPrimeToCube; primeToCube++) {
int cubedVal = primeToCube * primeToCube * primeToCube;
for (int primeToSquare = 2; primeToSquare <= maxPrimeToCube; primeToSquare++) {
int squaredVal = primeToSquare * primeToSquare;
int combinedVal = squaredVal + cubedVal;
if (combinedVal < minNum) {
continue;
}
if (combinedVal > maxNum) {
break;
}
String s = String.valueOf(combinedVal);
Set<Character> uniqueDigits = new HashSet<>();
for (char digit : s.toCharArray()) {
uniqueDigits.add(digit);
}
if (uniqueDigits.size() == 10) {
count++;
System.out.println("val: " + s + " = " + primeToSquare + "^2 + " + primeToCube + "^3, count: " + count);
}
}
}
System.out.println(count);
}
}
解決策
コードのエラーは素数を使用していないことだと思います。
Ruby Prime クラスは素数のリストになります。 2 ~ 2143 の範囲の値を使用しているだけです。
Java クラスを使用して Prime クラスを模倣できます。 これにより、オブジェクトのインスタンス化中に指定された最大値を指定して、List に素数が設定されます。
class Prime {
List<Integer> list;
Prime(int maximum) {
list = new ArrayList<>();
boolean prime;
for (int valueA = 2; valueA <= maximum; valueA++) {
prime = true;
for (int valueB = 2; valueB * valueB <= valueA ; valueB++) {
if (valueA % valueB == 0) {
prime = false;
break;
}
}
if (prime) list.add(valueA);
}
}
}
以下に使用例を示します。
for (int prime_to_cube : new Prime(2143).list)
さらに、次のように String から Set への変換を模倣することができます。
// Check if all digits are unique by converting to a set
s = String.valueOf(combined_val);
if (new HashSet<>(Arrays.asList(s.split(""))).size() == 10)
以下は、Ruby コードからの完全なリファクタリングです。
prime_to_square ループの場合、必要な結果を得るには最大 100,000 の Prime リストを使用する必要がありました。
int f() {
// Determine the max & min numbers that can be made with 10 distinct digits and no leading zeroes
long max_num = 9_876_543_210L;
long min_num = 1_023_456_789;
// Find the largest prime having a cube <= max_num
long max_prime_to_cube = 2143;
int count = 0;
// Cube every prime up to 2143
long cubed_val, squared_val, combined_val;
String s;
for (long prime_to_cube : new Prime(2143).list) {
if (prime_to_cube > max_prime_to_cube) return count;
cubed_val = prime_to_cube * prime_to_cube * prime_to_cube;
// Try adding the square of every prime until we exceed the maximum valid number
for(long prime_to_square : new Prime(100_000).list) {
squared_val = prime_to_square * prime_to_square;
combined_val = squared_val + cubed_val;
if (combined_val < min_num) continue;
if (combined_val > max_num) break;
// Check if all digits are unique by converting to a set
s = String.valueOf(combined_val);
if (new HashSet<>(Arrays.asList(s.split(""))).size() == 10) {
count += 1;
System.out.printf(
"val: %s = %d^2 + %d^3, count:%d%n",
s, prime_to_square, prime_to_cube, count);
}
}
}
return count;
}
出力
val: 1328675409 = 36451^2 + 2^3, count:1
val: 1478325609 = 38449^2 + 2^3, count:2
val: 3085469217 = 55547^2 + 2^3, count:3
val: 3507126849 = 59221^2 + 2^3, count:4
...
val: 9682357410 = 5689^2 + 2129^3, count:1267
val: 9837162450 = 13681^2 + 2129^3, count:1268
val: 9814362750 = 523^2 + 2141^3, count:1269
val: 9815674302 = 1259^2 + 2141^3, count:1270
1270