在提供的条件下获得给定范围内的素数

时间:2019-06-15 00:32:09

标签: java algorithm

这是我采访中问的。我必须编写一个程序来查找在给定范围内所有仅有奇数位的质数。

Eg: 31 is a prime number having only odd digits in it 3 & 1.
Eg: 23 is a prime number but it is not having odd digits in it, because it has digit 2.

现在我的程序还有一个约束,我将传递一个名为temp的变量。

  

现在,如果此温度为1,那么我应该找到质数,其数字仅包含<= 5

     

如果此温度为2,那么我应该找到质数,其数字仅包含>= 5

示例输入:

如果开始位置为30,结束位置为40,温度值为1。可能的素数是3137中的3040

31 prime has digits 3 & 1 => so these digits are <= 5. 
Now if my temp input data is `1` then the program should return me 1.
If suppose my temp input data is `2` then the program should return me 0.

37是具有3和7数字的质数。这里3 <= 5和7> =5。因此,我们不应计算该质数,因为它不会属于为我的temp变量定义的任何类别。

  

因此,对于输入值start = 30,end = 40,temp = 1,输出应为1。   (因为素数为31)。

我想出了以下代码:

public static int process(int start, int end, int temp) {
    List<Integer> matching = new ArrayList<>();

    // loop from start to end
    for (int i = start; i <= end; i++) {
        // 0 & 1 are not primes so skip them
        if (i == 1 || i == 0) {
            continue;
        }

        // Check if the number is a prime
        if (isPrime(i)) {

            // Get the digits of that prime number Eg: 31 has digits 3 & 1
            List<Integer> nums = new ArrayList<>();
            buildDigits(i, nums);


            // Codition to check if we need to consider this prime or not in our result.
            boolean flag = true;
            for (Integer num : nums) {

                // The prime number is has an even digit, so discard it.
                if (num % 2 == 0) {
                    flag = false;
                    break;
                }

                // The prime has a digit > 5 where as the restriction falls under step 1, so discard
                if (temp == 1 && num > 5) {
                    flag = false;
                }

                // The prime has a digit < 5 where as the restriction falls under step 2, so discard
                if (temp == 2 && num < 5) {
                    flag = false;
                }
            }

            // Get the required primes
            if (flag) {
                matching.add(i);
            }
        }
    }
    // Return their count
    return matching.size();
}

// Find out all digits in a given number, and put them in the list called nums
public static void buildDigits(int num, List<Integer> nums) {
    if (num / 10 > 0) {
        buildDigits(num / 10, nums);
    }
    nums.add(num % 10);
}

// This just finds out if the given input is prime or not
public static boolean isPrime(int n) {
    if (n <= 1) {
        return false;
    }
    if (n <= 3) {
        return true;
    }

    if (n % 2 == 0 || n % 3 == 0) {
        return false;
    }

    for (int i = 5; i * i <= n; i = i + 6) {
        if (n % i == 0 || n % (i + 2) == 0) {
            return false;
        }
    }
    return true;
}

在上面的代码中,我已使用此link作为isPrime查找是否为质数的基础。

当我在访谈中使用此代码时,它仅清除了8个测试用例中的3个。这些测试用例是隐藏的,我不清楚该逻辑失败的输入是什么。

我也以调试模式浏览了此代码,但是我找不到错误的地方。

0 个答案:

没有答案