这是我采访中问的。我必须编写一个程序来查找在给定范围内所有仅有奇数位的质数。
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
。可能的素数是31
至37
中的30
,40
。
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个。这些测试用例是隐藏的,我不清楚该逻辑失败的输入是什么。
我也以调试模式浏览了此代码,但是我找不到错误的地方。