正如问题所说。我需要计算给定数字的除数数量,比如 x。但限制是除数必须至少有一位与给定数字 x 相同的数字。
说 10 答案将是 2。(1,10,2,5 是除数,但只有 1,10 与 10 共享相同的数字)
我认为这应该有效:
private static boolean containCommonDigit(int n1, int n2) {
for (char c : ("" + n1).toCharArray())
if (("" + n2).contains("" + c))
return true;
return false;
}
public static int countSpecialDivisors(int n) {
int count = 0;
for (int i = 1 ; i <= n / 2 ; i++)
if (n % i == 0 && containCommonDigit(n, i))
count++;
return count + 1; // since we are looping to n/2
}
请注意,我们只是循环到,n/2
因为我们知道n
除了自身之外,它不会有大于自身一半的除数,这解释了为什么我们在末尾添加 1(显然,n
与自身共享至少一个公共数字)。
有关进一步优化的想法,请参阅评论。
1)您需要找到数字的所有除数,这可能很棘手 - 请参阅http://en.wikipedia.org/wiki/Divisor_function
2)接下来,由数字和它的除数给出 - 你需要提取所有数字,这很简单 - 只需将除以 10 的余数并继续小数部分。将数字放入 Set
3)在集合上使用 removeAll ,如果集合改变 - 那么有共同的数字
用你找到的下一个除数重复步骤 2/3。
有一种非常简单的方法可以做到这一点。
public String (int numberToBeFactored){
String result = "1, ";
for(int i = 2; i < numberToBeFactored){
if (numberToBeFactored % i == 0){
result = result + Integer.toString(i) + ", ";
}
}
result.trim();
return result;
}