Java 与给定数字至少有一个公共数字的数的除数的数目

Java 与给定数字至少有一个公共数字的数的除数的数目,java,algorithm,math,numbers,Java,Algorithm,Math,Numbers,正如问题所说,我需要计算一个给定数字的除数,比如x。但限制条件是除数必须至少有一位数字与给定的数字x共用 假设答案是2。(1,10,2,5是除数,但只有1,10与10共享相同的数字)1)您需要找到数字的所有除数,这可能很棘手-请参阅 2) 接下来,由数字和它的分频器给出-您需要提取所有数字,这很简单-只需将除法的余数除以10,然后继续小数部分。将数字放入集合 3) 在集合上使用removeAll,如果集合已更改,则存在通用编号 对找到的下一个除数重复步骤2/3。我认为这应该有效: private

正如问题所说,我需要计算一个给定数字的除数,比如x。但限制条件是除数必须至少有一位数字与给定的数字x共用

假设答案是2。(1,10,2,5是除数,但只有1,10与10共享相同的数字)

1)您需要找到数字的所有除数,这可能很棘手-请参阅

2) 接下来,由数字和它的分频器给出-您需要提取所有数字,这很简单-只需将除法的余数除以10,然后继续小数部分。将数字放入集合

3) 在集合上使用removeAll,如果集合已更改,则存在通用编号


对找到的下一个除数重复步骤2/3。

我认为这应该有效:

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
}
private静态布尔数(int n1,int n2){
对于(字符c:(“”+n1).toCharArray())
if((“”+n2).包含(“”+c))
返回true;
返回false;
}
公共静态整数计数器专用查看器(整数n){
整数计数=0;

对于(inti=1;i,有一种非常简单的方法可以做到这一点

 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; 

   }
公共字符串(int numberToBeFactored){
字符串结果=“1”;
for(int i=2;i
@这一切都不是家庭作业。这是编程门户上的一个编程问题。考虑到x可以大到10^9。暴力是不起作用的。听起来你希望我们为你做这件事。老实说,没有任何问题,只是一个需求列表。@算法师:然后写下暴力,问我们如何改进的问题你的实现。为了记录在案,我的C#brute force会发现数字9876543210有72个除数,它们在156568毫秒(不到3分钟)内满足这些要求。一个更好的数字可能有助于更好的测试…一个没有所有可能的数字的测试。@CoreyOgburn-愚蠢。为什么要花3分钟来做这样的事情呢?首先,计算数字的系数。9955687758=2x3x31x535203。然后列出唯一的除数对于计算它和找到除数来说都是微不足道的、真正毫秒级的工作。{1, 2, 3, 6, 31, 62, 93, 186, 53525203, 107050406, 160575609, 321151218, 1659281293, 3318562586, 4977843879, 9955687758}测试数字是另一项工作,只需几秒钟,而不是几分钟,这就是我所说的蛮力。最好让循环运行n/2次,你不觉得吗?是的,好主意,我在上面编辑了答案。嘿,为了让它运行得更快,将它循环到sqr(n),然后可以使用下面的代码
if(n%I==0){if(containCommonDigit(n,i))计数++;如果(containCommonDigit(n,n/i))计数++;}
而且我们不需要在最后一行增加计数器好主意-我会让OP处理任何进一步的优化,只要他对上述代码的工作原理有一个大致的了解。运行时间是多少?尽管问题问得很糟糕,但我对答案很好奇。我不认为除数函数提供了算法来获得所有的结果除数,它只是定义了divisors@AnkurMittal我并没有说它会给出所有的除数,只是说明哪些属性可能有用。