Prime连接问题

时间:2017-03-15 18:40:12

标签: java

以下问题在我的一个考试中给出,并被要求仅使用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);

1 个答案:

答案 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