質問が言うように、私は与えられた数の除数の数を数える必要がありますx. ただし、除数には、指定された数値 x と共通する数字が少なくとも 1 つ必要であるという制約があります。
10 の場合、答えは 2 になります (1、10、2、5 は約数ですが、10 と同じ数字を共有するのは 1、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
ことがわかっているため、ループしているだけであることに注意してください。これが、最後に 1 を追加する理由を説明しています (明らかに、少なくとも 1 つの共通桁をそれ自体と共有しています)。n
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;
}