【问题标题】:No Of Divisors of a number having atleast one common digit with the given number [closed]与给定数字具有至少一个公共数字的数字的除数数[关闭]
【发布时间】:2012-08-26 12:28:58
【问题描述】:

正如问题所说。我需要计算给定数字 x 的除数。但约束条件是除数必须至少有一位与给定数 x 相同。

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

【问题讨论】:

  • @all 这不是家庭作业..这是编程门户网站上的编程问题.. 鉴于 x 可以大到 10^9.. 蛮力行不通..跨度>
  • 听起来您希望我们为您做这件事。老实说,没有任何问题,只是列出要求。
  • @Algorithmist:然后写蛮力,问我们如何改进你的实现。
  • 记录一下,我的 C# 蛮力会发现数字 9876543210 在 156568 毫秒(不到 3 分钟)内有 72 个除数满足这些要求。一个更好的数字可能会带来更好的测试……但其中没有所有可能的数字。
  • @CoreyOgburn - 傻。为什么要花 3 分钟做这样的事情?首先,考虑数字。 9955687758 = 2x3x31x53525203。然后列出唯一的除数是微不足道的,真正的毫秒工作,既要考虑它,又要找到除数。 {1、2、3、6、31、62、93、186、53525203、107050406、160575609、321151218、1659281293、3318562586、4977843879、9955687758}。测试数字是另一项工作,只需几分之一秒,而不是几分钟,这就是我所说的蛮力。

标签: java algorithm math numbers


【解决方案1】:

我认为这应该可行:

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 至少共享一个共同的数字)。

有关进一步优化的想法,请参阅 cmets。

【讨论】:

  • 最好让循环运行 n/2 次,你不觉得吗?
  • 是的好主意,我编辑了上面的答案
  • 嘿,为了让它更快地循环它直到 sqr(n) 然后下面的代码可以使用if(n % i == 0){if(containCommonDigit(n, i)) count++; if(containCommonDigit(n, n/i))count++;} 而且我们不需要在最后一行增加计数器
  • 又是个好主意——我会让 OP 处理任何进一步的优化,只要他对上述代码的工作原理有一个大致的了解。
  • 运行时间是多少?尽管问的问题很糟糕,但我很好奇答案。
【解决方案2】:

1) 您需要找到该数字的所有除数,这可能很棘手 - 请参阅 http://en.wikipedia.org/wiki/Divisor_function

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

3) 在集合上使用 removeAll,如果集合改变了 - 那么有共同的数字

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

【讨论】:

  • 我不认为除数函数提供了获取所有除数的算法,它只是定义了除数的一些属性
  • @AnkurMittal 我没有说它会给出所有除数,只是说明哪些属性可能有用。
【解决方案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; 

   }

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2015-05-24
    • 2012-03-11
    • 1970-01-01
    相关资源
    最近更新 更多