Techioz Blog

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